MySQL-是否每个表都包含它';s自己的id/主列?

MySQL-是否每个表都包含它';s自己的id/主列?,mysql,sql,Mysql,Sql,我正在准备一个问答应用程序——只要有一个与之相关的问题,答案就会存在 所以我决定不给答案表提供它自己的id列,而是将主键设置为与问题id相关的外键 问题表: id | title 答案表: question_id | title 我应该这样做还是给答案表它自己的id列?如果一个问题可能有多个答案,那么最好在答案表上也有一个主键,以便在我们得到重复答案时唯一地标识每一行,如下所示 id |问题| id |标题 1 1 5 2 1

我正在准备一个问答应用程序——只要有一个与之相关的问题,答案就会存在

所以我决定不给答案表提供它自己的id列,而是将主键设置为与问题id相关的外键

问题表:

id | title
答案表:

question_id | title

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

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

id |问题| id |标题
1       1                5
2       1                5
3.2正确

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

id |问题|答案
1任务1?5.
任务2?5.
任务3?真的
任务4?无效的


我希望,这澄清了您的疑问。

以我的经验,为了阐述已经提出的两个有价值的意见,以下是定义数据库架构时要遵循的最有效的规则集(我将在后面给出原因):

  • 为每个表创建一个主键
  • 创建一个代理项作为主键
  • 当你有一对多关系(就像你在问答表中所做的那样)时,将一个表(你的问题表)中的PK包括在多个表(你的答案表)中注意:这正是你所做的。。。除了答案表没有自己的PK和代理键之外
  • 当两个表之间存在多对多关系时,创建一个与两个表具有一对多关系的链接/连接/关系表(这意味着将每个表的主键分别作为两个表的外键放入关系表中)
  • 原因(顺序相同):

  • 主键列保证表本身范围内的每一行的唯一性(不必涉及其他数据库对象&每一行都必须是唯一的)。在大多数数据库中,它们还提供默认索引,从而加快表扫描/查询的速度。如前所述,这有效地满足了需求
  • 我发现代理键是一种强大而有效的方法,可以简化数据库设计和表之间的关系。如果您不熟悉,请阅读此处:
  • 你已经这么做了,所以我想你应该明白这些好处
  • 这里仅提供一个示例,说明在每个表中使用代理键作为主键如何在数据库架构增长时帮助您。如果将来需要添加其他表,则无需花费大量时间和精力来确定如何连接它们,您已经拥有轻松创建连接表所需的所有键(例如,如果您稍后将用户添加到混合中…用户可以是问题或答案的作者,也可以是两者的作者…如果您尝试将相同的值独立地关联到两个问题和答案表,这可能会有点麻烦…事实上,这不起作用)

  • 答案应该有一个id属性和问题id,以满足第一个用于明确标识一行数据的普通类formI id。最好在数据库中的所有实体上都有一个id列。当您使用实体框架和其他ORM等工具时,这些id列非常方便。即使没有ORM,也要规范化对数据实体进行加密是一个好主意。