SQL Server中的数据库模型 - 参照完整性

时间:2014-07-01 08:37:37

标签: sql sql-server sql-server-2008 tsql

我们有一个表'XYZ',我们在其中插入不同表的数据 -

ID  TableName   RowID
1   Person       1
2   Company      1
3   Employee     5

如果我们想维护列RowID的引用完整性,我想只有两个选项:

  1. 基表:我们在所有表中通过列BaseID为每个表行创建唯一ID,并使用XYZ中的Base Table Column BaseID而不是RowID来维护参照完整性。

  2. 允许同一列将FK存储到多个表中,这也不是一种非常有效的方式。

  3. 因此,如果您知道维护诚信的有效方法,请告知。

    感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您有以下方法用于此目的:

1-为每个表都有一个参考表,并使用view for have XYZ:

PersonRows Table
ID RowId

CompanyRows Table
ID RowId

EmployeeRows Table
ID RowId


Create View XYZ AS    
  Select 'Person' AS TableName, RowID From PersonRows
  UNION ALL
  Select 'Company' AS TableName, RowID From CompmayRows
  UNION ALL
  Select 'Employee' AS TableName, RowID From EmployeeRows

2-在Person,Company和Employee表的每个触发器(插入,更新,删除)之后使用,以检查完整性。

例如:

Create Trigger tr_Person_Del ON Person
After Delete
AS Begin
  Delete From XYZ Where TableName = 'Person' and RowID in (Select Person.Id From Deleted)
End

3-使用下表(在此方法中,我建议对PersonRowID,CompanyRowID和EmployeeRowId使用稀疏列)

XYZ(ID, TableName, PersonRowId, CompanyRowId, EmployeeRowId)

答案 1 :(得分:1)

这是一个很好的判断。正如你所说,你有三个选择:

使用单个RowID列,但无法强制执行RI。

您可以创建一组可为空的列PersonRowID,CompanyRowID,EmployeeRowID等。其中每个都在相应的表上有一个FK,如果实体不是Person / Company / Employee,则为空。

您的另一个选择是为每种类型创建一个基表和另一个表。这在我看来是矫枉过正,对于三个子表,你最终得到一个Base表加上每个实体一个!。

我的建议是:

ID  TableName   PersonRowID   CompanyRowID   EmployeeRowID
1   Person       1            null           null
2   Company      null         1              null
3   Employee     null         null           5

然后,您将从PersonRowID到Person表,将CompanyRowID转换为Company表,将EmployeeRowID转换为Employee表。

我不得不承认 - 我首先质疑这张桌子的原因......也许你应该考虑一下这张桌子是否正确才能进一步发展?

答案 2 :(得分:0)

您不需要维护一个包含表名的表,SQL Server已经这样做了。

SELECT * FROM sys.tables

http://msdn.microsoft.com/es-es/library/ms187406.aspx