2011-03-17 78 views
0

假设我们有表A,B和C,然后我们希望表Z包含第TYPE列,它告诉我们Z中的记录与A,B和C的哪个表相关联。单独的ID字段的单独列?

为了使用索引,为列表A_IDB_IDC_ID中的每个表分配一个单独的列会更好吗?

或者是有什么理由使用通用列TYPE_ID可能会更好的性能?

+0

我不担心表现,但正确性。你打算如何加入表格 - 用动态SQL查找表格名称? SQL中不支持您正在尝试执行的操作。我会尽量避免整个情况。但是,如果你必须,Z应该有外部引用,唯一的原因就是z是持有的 - 引用外键。 – 2011-03-17 22:54:52

回答

1

使用type_id然后使用fk_id不会很好,因为索引的选择性是33%,这太高而无法使用。你总是在fk_id上索引(而不是链接到A,B,C) - 这可能需要在3个值之间打断(如果id被所有3种类型使用)。存储方面,索引从不存储空值,所以存储在索引中的项目的绝对数量,单个(fk_id)还是多个(a_id,b_id,c_id)将是相似的。

如果您是从确切的fk_id(来自A,B,C)开始,那么按照该顺序在(fk_id,type_id)上使用唯一索引可以快速识别所需的记录。

这似乎是为了简单和简洁,两列在这里比3好。

1

这有时是架构代码的气味。

如果您正在考虑将此列作为Z中的单个列,是否意味着A,B,C中只有一个可以适用于Z?

在我决定之前,我真的说我必须更多地了解实体和使用模式。访问来自已知的A,B或C,还是从Z端驱动的补充信息?如果它是从Z端驱动的,你是否想要获得所有的A,B和C列,然后从应用程序中选择性地使用它们,或者只需要将Zs与As或Zs一起使用,即通常知道子类型?此外,如果A,B和C有足够的列,则可以从Zs行中分离出来(如果它们每个都是1-1)(即,您可以将列设置为Z并且仅为NULL)

只是为了完整性,这可能给你更多的引用完整性(因为与单个列,你不能是一个FK为三个表)是有表Z_A,Z_B,Z_C:

随着模式:

Z_A: 
Z_ID REFERENCES (Z.ID) 
A_ID REFERENCES (A.ID) 

Z_B: 
Z_ID REFERENCES (Z.ID) 
B_ID REFERENCES (B.ID) 

Z_C: 
Z_ID REFERENCES (Z.ID) 
C_ID REFERENCES (C.ID) 

所有的ID在每个表中都是唯一的,这样就可以很好地限制一切,除非没有任何声明来阻止Z在多个表中没有触发器(您不能对SQL Server中的UNION ALL的索引视图的唯一约束)。

虽然它似乎增加了表的数量,但它们通常可以包装到视图中。

+0

适用于架构代码异味。尽管可能只是模式气味足够好 – 2011-03-17 22:24:12

+0

“如果您正在考虑将其作为Z中的单个列,是否意味着A,B,C中只有一个可以适用于Z?“每个a,b,c记录都可以有0个关联的z记录 – erikvold 2011-03-19 18:59:20

+0

@Erik Void - 现在我更加困惑了,这听起来像一排也没有关联的Z行,所以从Z到A,B,C)没什么意义,我需要更多地了解表格的实际含义 - 正在模拟什么? – 2011-03-19 22:08:53