【发布时间】:2015-12-13 13:02:41
【问题描述】:
我有一个 MySQL 表 people,如下所示:
id | object_id | name | sex | published
----------------------------------------------
1 | 1 | fred | male | [timestamp]
2 | 2 | john | male | [timestamp]
我有两个 ids 的原因是,在我的 CRUD 应用程序中,用户可能会编辑现有对象,在这种情况下它变成草稿,所以我有两行(草稿记录和已经存在的记录) 使用相同的object_id,如下所示:
id | object_id | name | sex | published
----------------------------------------------
2 | 2 | john | male | [timestamp]
3 | 2 | john | female | NULL
这使我可以跟踪记录的草稿和发布状态。当id 为 3 的行发布时,其published 字段将被标记并删除已发布的行。
每个人也有工作经历,所以我有一张桌子history:
id | person_object_id | job
----------------------------------
1 | 2 | dev
2 | 2 | accountant
这是约翰的工作经历。我在 person_object_id 字段中引用了 John 的 object_id,因为如果我引用他的 id,如果我删除了上面示例中的 John 行之一,我将冒着断开两个表的风险。
所以我的问题是:使用非主键(object_id 而不是id)来引用一个表,就像我上面所做的那样,不是效率低下吗?当我需要非唯一 id 来跟踪草稿/已发布行时,如何引用主键?
【问题讨论】:
-
只要列有索引,不管是不是主键。
-
嗯,好的。我对数据库设计的认识很模糊,但我认为主键的意义在于加快对特定行的访问。
-
谢谢。 irudyak 的回答似乎完全符合我的用例?
标签: php mysql database-design primary-key