MySQL - 每个表都应该包含它自己的id / primary列吗?

时间:2014-05-28 18:12:03

标签: mysql sql

我正在整理一个问题和答案申请 - 只要存在与之相关的问题,答案才会存在。

所以我决定不给答案表它自己的id列,并使主键成为与question_id相关的外键。

问题表:

id | title

答案表:

question_id | title

我应该这样保留它还是给答案表它自己的id列?

2 个答案:

答案 0 :(得分:1)

如果单个问题可能有多个答案,那么最好在answer表上设置一个主键,以便在我们得到重复答案时唯一地标识每一行

id | question_id | title 1 1 5 2 1 5 3 2 true

但是,如果您预计每个问题只有一个答案,那么最好将其合并到question表,因为问题和答案都直接依赖于单个主键。

id | question | answer 1 quest 1 ? 5 2 quest 2 ? 5 3 quest 3 ? true 4 quest 4 ? null

我希望,这可以澄清你的怀疑。

答案 1 :(得分:1)

根据我的经验,对两个有价值的评论进行阐述,以下是定义数据库模式时要遵循的最有效的规则集(我将在之后给出理由):

  1. 为每个表创建主键
  2. 创建代理键作为主键
  3. 如果你有一对多的关系(正如你在问题和答案表中所做的那样),请在多个表中包含来自一个表(你的问题表)的PK(你的答案表)注意:这完全是你已经完成了...除了答案表没有它自己的PK&代理关键
  4. 当两个表之间存在多对多关系时,创建一个与两个表有一对多关系的链接/连接/关系表(这意味着您将每个表的主键作为外部表放入关系表中两个表的关键,分别)
  5. 理由(按相同顺序):

    1. 主键列保证表本身范围内每一行的唯一性(不需要涉及其他数据库对象,并且每行都必须是唯一的)。它们还在大多数数据库中提供默认索引,从而加快表扫描/查询。如上所述,这有效地符合first normal form
    2. 我发现代理键是一个强大的&简化数据库设计和简化的有效方法;表之间的关系。如果您不熟悉,请在此处阅读:http://en.wikipedia.org/wiki/Surrogate_key
    3. 你已经这样做了,所以我假设你了解这些好处。
    4. 这里只是提供一个示例,说明如何使用代理键作为每个表中的主键,可以在数据库模式增长时帮助您。如果您将来需要添加其他表格,则无需花费太多时间和时间。努力弄清楚如何加入它们你已经拥有了轻松创建连接表所需的所有密钥(例如,如果你以后将用户添加到混合中......用户可以是问题或答案的作者,或两者兼而有之。 ..如果你试图将SAME值独立地与问题和答案表相关联,这可能会有点麻烦......实际上它不起作用)