2011-10-24 56 views
0

对数据库模式的相当新颖(计划使用SQLite)。话虽如此,我正在考虑使用代理键,因为数据库当前包含一个复合键(3列),它出现在我的大部分表中。我有几个表,其中包含3列的唯一键和一列包含一些信息;我也有一个表包含3列的唯一键和相同的3列作为外键(许多父母)。将所有这些表合并到一张表中似乎没有意义,因为会有许多空的字段。代理键与复合键

如果我选择其中一个,任何坑都会掉下来?通常认为哪一种编程更方便?

预先感谢您。

回答

4

每种技术都有优点和缺点。

通常,如果您只需引用单个代理键列,则编写SQL语句和JOIN会更容易。它也大大减少了数据库的大小。

另一方面,使用代理键时,您经常发现自己不得不向您的JOIN添加至少一个额外的表,以便检索属于代理键的信息。代理键的附加

两个优点:

  1. 许多框架要求使用的整数主键字段。

  2. 如果您将记录绑定到任何类型的用户界面控件(例如,网页上的输入),与识别目的相比,将单个值附加到控件上比编码和解码更容易多列。

+0

为什么在使用自动递增PK和代理键作为候选键时添加另一个表?尽管SQLite *总是*提供了一个ROWID又名“int PK” - 但我仍然放弃了/没有/单一的“PK” - 但仍然发现信息仍然可以在适当的约束下在模型中编码“减少”另一[候选/覆盖]指数,就减少插入时的碎片而言可能“更便宜”。如果候选人索引对表格进行了非规范化处理,那么它从未成为[代理人] PK的有效候选人,开始于... – 2011-10-24 00:22:04

+2

物料清单与产品,子部件,组件。在子程序集中,(ProductID,AssemblyName)是唯一的。如果您将此用作组件中的PK和FK,则可以使用仅使用组件的产品查找组件使用情况。如果使用代理整数主键,则必须加入子组合(或使用子查询技术)以获取该信息。 –

+0

谢谢你的简洁的答案。代理人确实吸引更多,因为我的大部分查询可能不会基于密钥(而是属性,例如分数)。尽管数据库和编辑的构建似乎更多,查询可能需要更长时间。 – jobobo