我正在设计一个数据库,它将存储关于一些艺术家的信息。这些艺术家可以属于一个或多个组织。从这些组织中,我只想存储他们的名字,并且我正在考虑与这些组织建立一个表格,这些组织只有名称作为主键而没有别的。是否只有一个表的主键是一个概念性错误?在这种情况下,我会欣赏一些建议来解决这个问题。只有主键字段的表有一个概念错误?
回答
您想要一个OrganizationId来处理组织名称更改的情况。
您可能还会遇到不同组织似乎具有相同名称的情况。有多少“现代艺术博物馆”? (对纽约客来说,只有一个;-)
您的组织表可能会随着时间的推移而扩大,包括短名称,地址,联系人,首选语言等字段。所以,这个表应该是这样的:
create table Organizations (
OrganizationId int not null identity(1,1),
Name varchar(255),
CreatedBy varchar(255) default system_user,
CreatedAt datetime default getdate()
)
在一个成熟的数据库,你甚至会认识到,企业名称变更,合并,有时分开。您可以通过向记录添加生效日期和结束日期来处理此问题。
好吧,我想我会用这个解决方案。谢谢,这非常有用。 – JavierElBene
这样的标准做法是为艺术家设置1个表格,为组织创建1个表格,并将1个关联表格与艺术家与1个或多个组织关联起来。
ARTIST (id, firstName, lastName)
ORGANIZATION (id, name)
ARTIST_ORGANIZATION(artist_id, org_id)
即使组织名称可能/应该是唯一的,这是很好的有一个数字ID作为主键,以便你可以做关联。查询与id的关联比搜索字符串更好。
事实上,只有主键的关键字有一个表的概念错误?
不是本身。有完全合法的情况下,所有的领域都包含PK。
在这种特殊情况下,组织名称是的关键,但是,这并不一定意味着它应该是主键 - 你可以“发明”的另一个关键是小(通常为整数),更容易保持并它小学,像这样:
的organizarion_id
被称为“代理键”,侗族的一些优点,其中包括:
- 孩子FKs会更苗条(因为只有整数被迁移到孩子,而不是整个字符串)。
- 您可以更新
organization_name
而不更新organization_id
,因此不会将此更新级联到子级。 - 一个小整数替代项可能比一个更复杂的自然键更适合于ORM。
缺点:
- 可能需要更多的加盟。
- 需要一个索引,并且每个附加索引都会带来开销(即使在基于堆的表中,但特别是在clustered tables中)。
正如你所看到的,这是一个平衡的问题,你是唯一一个有足够的领域知识做出正确决定的人。
注意:organization_artist
中的字段顺序很重要。如果您需要高效地查询给定组织的艺术家并在需要某个给定艺术家的组织时将其撤销,请使用上面显示的顺序。如果您需要两个方向,则需要在这两个字段(PK下方的索引旁边)使用另一个复合索引,但顺序相反。如果您只能使用一个索引,请考虑将此表集群化(如果您的DBMS支持它)。
- 1. 是否有ZODB一个主键概念对象
- 2. 主键和索引概念
- 3. TIBCO错误:一个概念文件没有编译
- 4. 只有主键表
- 5. 应该有一个非只读主键字段
- 6. 外键的概念
- 7. 如何使用主键概念关联3个表
- 8. 如何使用主 - 外键概念来检查多个表格
- 9. 。每个字段只有一个字段
- 10. 与内存管理概念的误解有关的错误?
- 11. System.Drawing.Font:没有字体重量的概念?
- 12. .load不工作,我想我有这个概念错误?
- 13. linq分组表只有一个字段
- 14. 如何使用外键和主键的概念连接两个表?
- 15. Couchbase是否具有“必填字段”的概念?
- 16. AngularJS的主页概念?
- 17. LinkedList下一个的概念
- 18. 有效的开发团队有哪些关键概念?
- 19. 有没有办法让linqpad知道一个字段是主键?
- 20. 什么语言有“保护”关键字或概念?
- 21. JPA,CLASS的元数据错误:多于一个主键字段
- 22. SQL错误只有一个表达式
- 23. SQLite的:复位主键字段错误
- 24. 如何只显示一个字段有多个主题的行
- 25. 只有一个错误,
- 26. 返回有错误的二维数组,需要概念
- 27. IBM Watson-提取关键字和概念
- 28. 关键字同步和同步概念
- 29. 错误,我尝试创建一个字段类型龙主键
- 30. 的jQuery插件概念图错误
不,一切都很好,只要两个组织不能有相同的名称。 –