我们目前有一个系统,每个客户在注册时都会获得自己的数据库。毫不奇怪,这已经失控了。
我们正准备将所有这些数据库合并到一个数据库中。为此,我们需要注意该行所属的组织。如何在数据库上处理这个问题以及下面的方法有哪些优点/缺点(速度,可维护性等)?
选项1 :将组织ID分配给所有表并使其成为主键的一部分(使所有键复合)。
选项2 :将组织ID添加到所有表中,作为具有组织表外键的列。
选项3 :还有别的。
我们正在考虑通过这一举措转移到NHibernate,如果这对所做的事情产生影响。
答案 0 :(得分:6)
选项1和2不是互斥的,您应该同时执行这两项操作。 组织上的外键约束有助于确保组织密钥有效。 复合主键是实现唯一性的唯一方法,除非您想要重新键入所有记录,并且它对查找性能也很有价值。或者,您必须在组合数据上创建新的主键列,例如标识列。这种变化可能需要在其他地方进行更多的改变。
答案 1 :(得分:3)
我工作的公司使用选项2,速度和可维护性不是太大的问题。至于速度,只要您正确设置索引,您的查询应该非常快。而且为了可维护性,我会说选项2肯定是朝着正确方向迈出的一步,与您现在处理的方向相比。它非常容易使用,您只需加入查询即可添加所需的任何客户信息。
Cdonner提出了一个很好的观点。在那些你将要查询的表中,有一个复合键是个好主意。如果您正确索引表格,它们可以帮助您查询性能
答案 2 :(得分:1)
我想我会选择#2,但这取决于你的主键在你的桌子上的样子,如果组织ID不在密钥中,你是否必须担心冲突。
请确保您将其编入索引,因为您可能会将其包含在大量查询中!
答案 3 :(得分:1)
使用此设计,您肯定会严重破坏所有查询。您需要在每个查询中再添加一个字段,否则您将忘记为最重要的字段执行此操作。
如果您仍想加入数据库,那么您真的需要使用GUID
。这将大大简化过渡。
如果您不使用ordering
的主键,那当然就是这样。
如果你这样做,你需要添加你想要的这个字段,或者更优选的是,添加一个虚假的自动增量字段并仍然使用GUID
作为主键。