既然你问了,这是好的做法,但在少数情况下(数据不需要连接),它可能不是绝对必需的。但最大的问题是,你永远不知道需求是否会改变,所以你现在真的想要一个,所以你没有在事实后添加一个到10米记录表.....
除了主键(它可以跨越多列顺便说一句)我认为这是一个很好的做法,有一个第二候选人的关键是一个单一的领域。这使联接更容易。
首先是一些理论。你可能还记得HS或者大学代数中函数的定义是:y = f(x)
其中f是一个函数,当且仅当每个x有一个y。在这种情况下,在关系数学中,我们会说在这种情况下y是functionally dependent
。
您的数据也是如此。假设我们正在存储支票号码,检查账户号码和金额。假设我们可能有多个支票账户,并且对于每个支票账户不允许有重复支票号码,那么金额在功能上取决于(账户,支票号码)。一般而言,您希望将数据存储在一起,这些数据在功能上依赖于同一事物,而无需传递依赖关系。主键通常是您指定为主键的功能依赖关系。这然后识别行中的其余数据(因为它与该标识符相关联)。把它看作是natural primary key.
尽可能(即不使用MySQL)我喜欢将主键声明为自然键,即使它横跨列。有时你可能有多个可互换的候选键,这会变得复杂。例如,考虑:
CREATE TABLE country (
id serial not null unique,
name text primary key,
short_name text not null unique
);
此表真的可以有任何列作为主键。这三个都是完全可以接受的候选键。假设我们有一个国家记录(232,'美国','美国')。这些字段中的每一个都唯一标识记录,因此如果我们知道其中一个我们可以知道其他字段。每一个都可以被定义为主键。
我还建议拥有第二个人造候选键,它只是用于连接链接的机器标识符。在上面的例子中,country.id是这样做的。这对于将其他记录链接到国家/地区表格很有用。
需要候选关键字的例外情况可能是重复记录真的可能存在的地方。例如,假设我们正在跟踪发票。我们可能会有两个项目独立开具发票的情况,两个项目中的每一个都会显示一个项目。这些可能是相同的。在这种情况下,您可能希望添加一个人造主键,因为它允许您稍后将事物连接到该记录。你现在可能没有必要这样做,但你可能在将来!
只用一个索引来尝试它,您不需要主键。获取性能没有的数字,看看它是否足够快。 –
谢谢,我会尝试。然而,从适当的关系角度来看,你会如何去做这样的事情?这不像是你可以创建另一个表格来表示一个人的候选名单,因为这还需要适应这样一个事实,即我们不知道这个人会添加多少人。所以你不能为每一个单独列 - 你需要一个新的行 - 回到相同的情况哈哈! – user1058210
您创建了一个具有两个用户标识作为列的表,因此您可以将某个人与其他人关联起来,并且如果要强制执行唯一性,请创建一个由两列组成的主键。 –