Database design 组合值以定义主键?

Database design 组合值以定义主键?,database-design,Database Design,我有一系列包含以下信息的行,我想将它们存储在关系数据库中。我正在考虑结合最小/最大年龄和性别来定义主键,但我真的不确定。你认为解决这个问题的最好办法是什么 Min age = 9 Max age = 13 Gender = 'M' Nutrient A = 500 Nutrient B = 500 ... Nutrient Z = 600 Min age = 9 Max age = 13 Gender = 'F' Nutrient A = 500 Nutrient B = 500 ...

我有一系列包含以下信息的行,我想将它们存储在关系数据库中。我正在考虑结合最小/最大年龄和性别来定义主键,但我真的不确定。你认为解决这个问题的最好办法是什么

Min age = 9
Max age = 13
Gender = 'M' 
Nutrient A = 500
Nutrient B = 500
...
Nutrient Z = 600

Min age = 9
Max age = 13
Gender = 'F' 
Nutrient A = 500
Nutrient B = 500
...
Nutrient Z = 600

您可以将这两个字段都用作主键--

创建一个新的id列。 将类型设置为整数。 检查自动递增。 将列设置为主键。 让数据库来处理它


不要依赖串联值的组合来提供唯一标识符。

我同意其他意见,请使用自动递增整数作为主键。我只会对SSN之类的东西使用自然键。

我同意@SergeyBenner的评论。自然键(在“现实生活”中唯一标识数据的键)似乎是{MinAge,MaxAge,Gender},尽管这可能简化为{Age,Gender},其中每个可能的年龄/性别对应一行(而不是每个年龄段对应一行)。但是,如果此表必须是外键关系的父级,则处理此表将非常困难(最多),因此包含代理键(yeolde integer identity列)将提高效率。(我会使代理键成为主键,但我也会在{Age,Gender}上创建一个聚集唯一索引。)


出于好奇,您是否总是为每行实际填充26列(A到Z)的数据?如果营养素的数量因组而异,您可能需要执行进一步的标准化。

但如果您希望稍后引用此表,则在另一个表中会有一个3字段的引用键。您可以使用identity或auto incremented字段标识代理主键,并在这3个字段上定义唯一索引。SN不是“自然键”,因为您(在现实世界中)会在野外找到重复项,而且人们会不时更改它们(几乎总是因为数据输入错误,但仍然是:哪条记录“错误”并不明显……).PKs永远不应该改变。@Craig,SSN可能被错误地发给多个人的事实并不自动意味着SSN不能是一个自然密钥。将SSN作为密钥是否明智取决于在数据库中强制其唯一性的可取性或其他方面。例如,在工资单系统中,它可能不是一个好的idea允许重复使用SSN或相关部门使用的任何其他标识符来识别您的员工!钥匙不得更改也不是绝对的规则。稳定性通常是可取的,但能够更新钥匙通常是有用的,甚至是必不可少的。@sqlvogel:那么,我们就不得不不同意了。碰巧的是,我保留了一个商业秘密l工资系统,我可以告诉你,如果一个新员工因为旧员工的坏数据而无法获得报酬,那么他们将不会高兴——也许是一个输入新数据的人无权更改的员工!痛苦应该属于真正造成问题的人,而不是发现问题的人。@Craig,我不认为有任何痛苦我同意这可能是不明智的(尽管我希望你仍然希望得到关于出现重复SSN的警告)。无论如何,我的观点是,你永远不能肯定地说SSN不是一个自然键,因为这取决于需求。@sqlvogel:是的,我们对检测到的重复项给出了严厉警告,但我们有一个一般的经验法则,即决不能对获得支票的员工设置任意的障碍。是的,检查的数量r每组都是常数。
Age Int NOT NULL,
Gender char NOT NULL,
CONSTRAINT id PRIMARY KEY (Age, Gender)