【发布时间】:2012-08-26 18:44:56
【问题描述】:
在我的数据库中,我有一个用户列表,其中包含有关他们的信息,并且我还有一个功能,允许用户将其他用户添加到候选名单中。我的用户信息存储在一个带有用户 ID 主键的表中,我还有另一个表用于候选名单。候选名单表的设计使其具有两列,基本上只是一对名称的列表。因此,要查找特定用户的候选名单,您可以从第二列中检索所有名称,其中第一列中的 id 是特定值。
问题在于,根据Should each and every table have a primary key? 等许多来源,您应该在数据库的每个表中都有一个主键。
根据此来源http://www.w3schools.com/sql/sql_primarykey.asp - 一个主键,它唯一地标识数据库中的一个条目。所以我的问题是:
我的数据库中的表有什么问题?为什么需要主键?
我应该如何给它一个主键?只需创建一个新的自动递增列,以便每个条目都有一个唯一的 id?这似乎没有多大意义。或者我会以某种方式将代表候选名单的多个条目封装到另一个表中的另一个实体中并将其链接起来?我真的很困惑。
【问题讨论】:
-
只用索引试试,不需要主键。获取关于性能的数字,看看它是否足够快。
-
谢谢,我会试试的。但是,从适当的关系角度来看,您将如何做这样的事情?您不能创建另一个表来代表一个人的候选名单,因为这还需要适应这样一个事实,即我们不知道该人将添加多少人。所以你不能为每个单独的列 - 你需要一个新行 - 回到相同的情况哈哈!
-
您创建了一个包含两个用户 ID 作为列的表,因此您可以将一个人与其他人关联起来,如果您想强制唯一性,则创建一个由两个列组成的主键。
-
您的候选名单很好。它在两列中都有一个主键;它有两个外键,一个用于引用主用户表的每一列。这是一个非常值得尊敬的设计。我认为候选名单的附加“id”列没有任何优点;您仍然需要对两个用户 ID 值进行唯一约束,并且您不太可能(但并非不可能)有任何其他表引用候选清单表的主键。您需要唯一(主键)约束,因此您不必在查询中使用 DISTINCT 以避免输出中出现重复行。
标签: database database-design entity-relationship