簡體   English   中英

SQL Server中的數據庫模型-引用完整性

[英]Database Model In SQL Server - Referential Integrity

我們有一個表“ 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存儲到多個表中,這也不是一種非常有效的方法。

因此,請告知您是否知道保持誠信的有效方法。

感謝幫助。

為此,您有以下方法:

1-每個表都有一個參考表,並使用視圖獲取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-對人員,公司和員工表中的每個表使用觸發器(插入,更新,刪除)之后,以檢查完整性。

例如:

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)

這很大程度上是一個判斷電話。 如您所說,您有三種選擇:

使用單個RowID列,但是您不能強制執行RI。

您可以創建一組可為空的列PersonRowID,CompanyRowID,EmployeeRowID等。 它們中的每一個都在適當的表上具有FK,如果實體不是個人/公司/雇員,則為空。

您的另一個選擇是為每個類型創建一個基礎表和另一個表。 我認為這太過分了,對於三個子表,您最終得到一個基本表,再給每個實體一個!

我的建議是:

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

然后,您將擁有FK,從PersonRowID到Person表,從CompanyRowID到Company表,從EmployeeRowID到Employee表。

我必須承認-我首先質疑此表的原因...也許您應該在進一步發展之前考慮一下該表是否正確?

您不需要維護帶有表名的表,SQL Server已經做到了。

SELECT * FROM sys.tables

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM