组织标识字段作为复合主键

时间:2009-02-20 13:57:09

标签: sql sql-server performance nhibernate database-design

我们目前有一个系统,每个客户在注册时都会获得自己的数据库。毫不奇怪,这已经失控了。

我们正准备将所有这些数据库合并到一个数据库中。为此,我们需要注意该行所属的组织。如何在数据库上处理这个问题以及下面的方法有哪些优点/缺点(速度,可维护性等)?

选项1 :将组织ID分配给所有表并使其成为主键的一部分(使所有键复合)。

选项2 :将组织ID添加到所有表中,作为具有组织表外键的列。

选项3 :还有别的。

我们正在考虑通过这一举措转移到NHibernate,如果这对所做的事情产生影响。

4 个答案:

答案 0 :(得分:6)

选项1和2不是互斥的,您应该同时执行这两项操作。 组织上的外键约束有助于确保组织密钥有效。 复合主键是实现唯一性的唯一方法,除非您想要重新键入所有记录,并且它对查找性能也很有价值。或者,您必须在组合数据上创建新的主键列,例如标识列。这种变化可能需要在其他地方进行更多的改变。

答案 1 :(得分:3)

我工作的公司使用选项2,速度和可维护性不是太大的问题。至于速度,只要您正确设置索引,您的查询应该非常快。而且为了可维护性,我会说选项2肯定是朝着正确方向迈出的一步,与您现在处理的方向相比。它非常容易使用,您只需加入查询即可添加所需的任何客户信息。

Cdonner提出了一个很好的观点。在那些你将要查询的表中,有一个复合键是个好主意。如果您正确索引表格,它们可以帮助您查询性能

答案 2 :(得分:1)

我想我会选择#2,但这取决于你的主键在你的桌子上的样子,如果组织ID不在密钥中,你是否必须担心冲突。

请确保您将其编入索引,因为您可能会将其包含在大量查询中!

答案 3 :(得分:1)

使用此设计,您肯定会严重破坏所有查询。您需要在每个查询中再添加一个字段,否则您将忘记为最重要的字段执行此操作。

如果您仍想加入数据库,那么您真的需要使用GUID。这将大大简化过渡。

如果您不使用ordering的主键,那当然就是这样。

如果你这样做,你需要添加你想要的这个字段,或者更优选的是,添加一个虚假的自动增量字段并仍然使用GUID作为主键。