Sql 我应该创建代理密钥吗?

Sql 我应该创建代理密钥吗?,sql,database,Sql,Database,我在一个数据集上工作,在这个数据集中,材料被测试为各种描述符。有时,单个材质描述符组合会有多个值。(例如,SKUABC-001具有易燃性测试,测试结果为WUXH005和WUXH008) 照目前的情况,所有自然的主键候选人都包含了结果,这似乎是不合理的。可以保证材质描述符结果是唯一的。我应该添加一个整数代理键,还是像下面这样添加一个更有意义的代理键 {SKU}-{test shorthand}#{SKU-test index} e、 g 为什么不使用多张桌子 Material -- contai

我在一个数据集上工作,在这个数据集中,材料被测试为各种描述符。有时,单个材质描述符组合会有多个值。(例如,SKUABC-001具有易燃性测试,测试结果为WUXH005WUXH008

照目前的情况,所有自然的主键候选人都包含了结果,这似乎是不合理的。可以保证材质描述符结果是唯一的。我应该添加一个整数代理键,还是像下面这样添加一个更有意义的代理键

{SKU}-{test shorthand}#{SKU-test index}
e、 g


为什么不使用多张桌子

Material -- contains all the info about the material
m_id -- The material id, primary key
...

Tests
t_id -- The test id, primary key
m_id -- Foreign key to the material table
... -- descriptions et whatnot

Results
r_id -- the specific result id, primary key
t_id -- Foreign key to the test table
... -- descriptions et whatnot

要选择数据,请使用两个联接:

select m.*, r.*
from materials m
inner join tests t
on t.m_id = m.m_id
inner join results r
on r.t_id = t.t_id

我突然想到了这一点。它似乎会增加复杂性和更多的连接,而不会真正减少数据库的大小。当我在没有PKs的表上检查SO时,他们似乎非常反对这个想法,因为更新和删除,但是对于那些操作,我可以在内部使用测试结果。
select m.*, r.*
from materials m
inner join tests t
on t.m_id = m.m_id
inner join results r
on r.t_id = t.t_id