mysql - 为了拥有主键,我应该添加一个 autoinc 主键吗?

标签 mysql database-design primary-key

我有一个需要 2 个字段的表。一个是外键,另一个不一定是唯一的。除了阅读“每个需要的表格都需要一个主键”之外,我真的找不到拥有主键的理由。

编辑:

这里有一些好的想法。

为了清楚起见,我将给你一个类似于我的数据库需求的例子。

假设有一个包含产品类型、数量、成本和制造商的表格。

产品类型并不总是唯一的(例如,MP3 播放器),但制造商/产品类型将是唯一的(例如,Apple MP3 播放器)。忘掉制造商为这个例子制作的各种模型吧。为方便起见,该表有一个自动递增的主键。

我给出了一个点值并记录了这些产品被搜索、添加到购物车和购买以显示在热门商品列表中的频率。

我目前的布局方式是在第二个表中,其中 FK 指向主表,第二列表示该项目获得的“人气点”总数。

这里看到的答案让我觉得也许我应该只在我的主要产品表中添加一个“点”列,这样我就可以在那里跟踪……但这似乎我没有足够地规范我的数据库.

我的问题是我目前主要只是一个业余爱好者,做这件事是为了学习,没有 DBA 的奢侈来告诉我如何设置我的表,所以我必须学习编码方面和数据库端。

最佳答案

你要区分primary keysurrogate key .自动递增的列是后者的一个特例。因此,您的问题是双重的:

  1. 是否每个表都需要有一个主键?
  2. 是否每个表都需要有代理主键?

第一个问题的答案是YES,除了一些特殊情况(多对多关系的关联表可以说是这种特殊情况的一个例子)。这样做的原因是您通常需要能够(如果不是现在,那么将来)一致地处理该表的各个行 - 例如更新/删除。

第二个问题的答案是NO。如果您的表代表一个核心业务实体,那么或者它可以从多对一关联中引用,那么使用代理键可能是个好主意;但这不是绝对必要。

有点不清楚你的表的功能是什么;根据您的描述,听起来它具有“值集合”语义(FK 到“主”表 + 值)。在这种情况下,某些 ORM 不支持代理键;如果那是提示您问题的原因,则可以关闭代理项(如果是袋子,甚至是主要项)键。

关于mysql - 为了拥有主键,我应该添加一个 autoinc 主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1678161/

相关文章:

mysql - 如何拥有一个集中的MySQL数据库?

mysql 查询连接 3 个表,其中一个表没有关联

mysql - 将查询转换为嵌套查询

sql - sql server数据库中的主键数据类型

C#生成唯一的Guid(不存在于数据库的表中)

mysql - 延迟评估 MySQL View

javascript - 添加动态输入字段作为数组并存储到数据库中

mysql查询多个字段并将null分配给缺失的字段

mysql - 有关移动应用中的 Firebase 和 MySQL 的问题

foreign-keys - 识别 Sybase 表、字段、键、约束