2011-11-16 31 views
1

我对选择表主键有疑问。 假设我们有3个相关的表如下所述:表索引性能。关于选择主键的选项

TBL_A 
{ 
'A1' varchar (64), // assume this is the unique attribute. 
'A2' varchar (64), 
} 

TBL_B 
{ 
'B1' varchar (64), // assume this is the unique attribute. 
'B2' varchar (64), 
} 

TBL_C 
{ 
'C1' varchar (64), // assume this is the unique attribute. 
'C2' varchar (64), 
} 

关系:

  • TBL_A和TBL_B为多对多之间,
  • TBL_AB和TBL_C之间的一对多

的问题是:

  1. 哪一个更好:选项A:将每个表的唯一属性设置为表的主键?或者选项B:创建另一个属性作为一个id(自动编号)并用唯一约束来设置表的唯一属性。 (将应用于所有这三个表)。

  2. 然后TBL_AB将需要复制TBL_A和TBL_B中的主键作为参考键。这个问题和我以前的问题一样,我们是否应该将这两个引用键保留为TBL_AB的主键。或者创建一个新的唯一属性(自动编号)作为TBL_AB的主键,并使两个引用的属性具有唯一约束条件更好。

  3. 因为od TBL_C将引用TBL_AB的主键,当然我们在前两个问题中选择的选项将会生效。如果我们选择第一个选项,将会有两个引用属性,但是如果我们选择第二个选项,我们将只有一个引用属性。你怎么看,。?

的想法是当我们在搜索的情况下,将查询一个整数(或数字)输入主键进行比VARCHAR类型的主键快,。? 哪一个更好?当然如果你有'为什么',。

谢谢你的每一个答案和建议。 关于,

+0

_Why_你有'b1'和'c1'作为他们表的属性吗?仅仅因为那是'Tbl_A'中的关键,还是它的唯一键的一部分呢?并且您有多少行存储/处理(请记住,在连接期间处理的行数会增加!)? “Tbl_AB”的定义是什么/在哪里?是联合/视图还是什么,为什么要合并这些表? –

+0

嗨Christian,a1,b1, – simaremare

回答

1

我不会太担心主键是varchar。如果将自动编号作为主键的单独字段使用,速度的小幅增加(如果有的话)可能需要将varchar添加到索引,否则每次查找都需要进行偏移并访问表在需要时获取varchar。 除非你的表是数百万条记录,否则就按照自然的方式设置主键。

+0

谢谢Rodolfo,我想我会对你的答案进行表决,并以自然的方式去做。 非常感谢。 :) – simaremare