database - 拥有仅包含主键字段的表是概念错误吗?

标签 database database-design

我正在设计一个数据库来存储一些艺术家的信息。这些艺术家可以属于一个或多个组织。从这些组织中,我只想存储他们的名字,我正在考虑与这些组织创建一个表,这些组织只将名称作为主键,没有别的。有一个只有主键字段的表是一个概念错误吗?在这种情况下,我会感谢一些解决该问题的建议。

最佳答案

Is the fact of having a table with just the fieds of the primary key a conceptual error?

不是自己。在完全合法的情况下,所有字段都包含一个 PK。

在这种特殊情况下,组织名称​​是一个键,但这并不一定意味着它应该是键——您可以“发明”另一个键更小(通常是整数)并且更容易维护并使成为主要的,如下所示:

enter image description here

organizarion_id 被称为“代理键”,这样做的一些优点包括:

  • 子 FK 会更 slim (因为只有整数会迁移到子 FK,而不是整个字符串)。
  • 您可以在不更新 organization_id 的情况下更新 organization_name,因此不会将此更新级联给子级。
  • 与更复杂的自然键相比,小整数代理对 ORM 可能更友好。

缺点:

  • 可能需要更多的加入。
  • 需要多一个索引,每增加一个索引都会带来开销(即使在基于堆的表中,尤其是在 clustered tables 中)。

如您所见,这是一个平衡问题,只有您拥有足够的领域知识来做出正确的决定。

注意:organization_artist 中的字段顺序很重要。如果您需要有效地查询给定组织的艺术家,请使用上面显示的顺序,如果您需要给定艺术家的组织,请使用上面显示的顺序。如果您需要两个方向,您将需要在这两个字段上的另一个复合索引(在 PK 下方的索引旁边),但顺序相反。如果您只能使用一个索引,请考虑对该表进行聚类(如果您的 DBMS 支持)。

关于database - 拥有仅包含主键字段的表是概念错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266790/

相关文章:

ruby-on-rails - 如何找到MLS数据?

django - 在 Django 中创建数据库驱动的主导航?

sql - 多个但互斥的外键 - 这是要走的路吗?

数据库设计 : Could I make a column in a table only allows one 'true' for some specific rows and others false for same specific rows

python - adbapi 连接池限制

sql-server - 如何从 SQL Server 中的 entair 数据库中获取精确的两列表

java - MySQL JDBC 插入多对多对象而不添加重复项

mysql - 用于存储未知和技术上无限长度的数据的数据库字段长度?

python - 值错误 : "..." needs to have a value for field "..." before this many-to-many relationship can be used

database - 在 postgresql 9.5 中安装 Orafce