重构数据库表以具有公共“基础”表

时间:2013-11-18 08:26:42

标签: sql-server database tsql

在我的数据库中,我有一些看起来像这样的表:

table1
---------------
id  name


table2
---------
id  name  ParnetId     <-This is an ID from Table 1



table3
---------------
id  name  ParnetId     <-This is an ID from Table 2

在过去,似乎这三个表是完全独立的实体,但现在(由于新请求的功能......)我需要从另一个表中引用三个表中的任何一个。
类似的东西:

table4
---------------
id  name  foreignKey   <-This ID should be from Table 1 OR Table 2 OR Table 3

所以,我想我可以添加一个表来保存表1-3的Id并从表4中引用它(+表从Id列中引用)。

请注意,我正在处理已包含数据的实时数据库。

我的问题是:

  1. 执行重构过程时是否需要注意什么?
  2. 如何将表1-3中的现有记录ID迁移到表4(与三个表中相同的id相关)?
  3. 你能想到更好的策略吗?

2 个答案:

答案 0 :(得分:0)

具有自己的主键的新表(例如,CommonTable),可空字段作为table1,table2和table3的外键似乎是要走的路。

这样,table4可以有一个CommonTable外键,可以链接到table1或table2或table3。

第二种方法是在table1,table2和table3上创建一个视图(例如CommonView)。你需要为此编制一个假的主键 - 对于table1 / 2/3,可能是“t1-xxx”,“t2-xxx”,“t3-xxx”。我已将此技术用作临时数据迁移机制,但不会将其视为长期解决方案。

第三种方法,可能是最容易实现的方法,只是在table4上有多个可以为空的外键:

table1Id table2Id table3Id

我强烈建议不要让一个字段成为多个表的外键。我已经看到了这一点,这是一个与之合作的噩梦。想想未来开发人员的困惑。

答案 1 :(得分:0)

我建议总共有7个表table4,table1,table2,table3,t4t1link,t4t2link和t4t3link。

t4tXlink表应包含table4和tableX中的主键。因此,您可以在数据库中拥有适当的约束。

如果您只有一个表包含3个单独的外键,则您不能使用不允许来自其他2列的值的约束。