我注意到许多程序员添加了ID列并将其用作主键.我认为,从设计的角度来看,它存在缺陷,因为在这种情况下,ID与表格无关.
解决方法
“此表中的一条记录将代表……?”
“对于Col X,Col Y,Col Z的不同值,表中应该只有一行”,Cols X Y和Z是什么?“
CAR_MODEL表.
嗯,如果MANUFACTURER_NAME成为关键,这张表将存储有关不同类型汽车的信息吗?不,我可以用很多行来识别同一制造商的不同车型.嗯,MANUFACTURER_NAME和MODEL_NAME应该是关键吗?不,我希望同一个MANUFACTURER_NAME和MODEL_NAME有不同的行,但同时表中的发布年份不同.那么“MANUFACTURER_NAME”,“MODEL_NAME”和“RELEASE_YEAR”怎么样?
我是否可以同时拥有两个同时包含MANUFACTURER_NAME,MODEL_NAME和RELEASE_YEAR的行?嗯不.这没有意义,他们将是相同的汽车模型,我只想要每车型1记录.太棒了,这才是关键.
此表中的一条记录将代表特定制造商的特定年份的特定模型.我在创建表时决定这一点,这就是我创建表的原因,如果你无法描述表中的内容,那么有助于识别你不明白为什么要创建它的键.
随时间变化的可怕变化! (代理键,自然键,缓慢变化的尺寸)
啊,但我存储的关于特定汽车模型(来自特定制造商和发行年)的信息可能会发生变化.最初我被告知它有两个门,现在我发现它有四个,我希望在我的表中有正确的信息,但不会丢失旧的记录,因为人们报告了它,我需要能够重现他们的旧结果.
好的,我将添加一个新列“MODEL_ID”并使其成为表的主键,因此我可以存储具有相同型号名称,制造商名称和发行年份的多个记录.我还将添加valid_from和valid_to时间戳.
这可以很好地工作,事实上,通过我的更改,表的主键现在是MODEL_ID,一个代理键.但是自然键,商业密钥,“在任何时间点”的关键,仍然是Model_Name,Manufacturer_Name和Release_Year,我不能忽视这一点.
关于代理键的注意事项:
根据定义,代理键对于每一行都是唯一的!代理键有时可以更轻松地处理数据,尤其是随时间变化的数据.但代理键不会以任何方式取代自然主键,您仍然需要知道表格的“颗粒”是什么.
如果我们说澳大利亚的每个人都会被分配一个Stack_Overflow_User_id当Jeff和Joel开始向狗和猫提供Stack_Overflow_User_Id和同一个人的多个ID时,我们会做什么?
我们会说,“嘿Jeff和Joel,每个First_Name,Last_Name,Date_of_Birth和Place_of_Birth只给出1个ID!”. *
我们需要知道自然键或者我们可以提供任何代理键!
(*那些所有这些相同的人怎么样?我们不需要护照号码或某种代理人吗?在实践中,代理人很好而且干净,但它起源于哪里?最初它来自一个自然的钥匙.)