首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server中的数据库模型-引用完整性

SQL Server中的数据库模型-引用完整性
EN

Stack Overflow用户
提问于 2014-07-01 08:37:36
回答 3查看 57关注 0票数 0

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

代码语言:javascript
复制
ID  TableName   RowID
1   Person       1
2   Company      1
3   Employee     5

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

  1. 基表:通过所有表中的列BaseID为每个表行创建唯一ID,并在XYZ中使用Base列BaseID,而不是通过RowID来维护引用完整性。
  2. 允许同一列将FKs存储到多个表,这也不是一种非常有效的方法。

因此,如果你知道保持诚信的有效方法,请提出建议。

谢谢你帮忙。

EN

回答 3

Stack Overflow用户

发布于 2014-07-01 08:44:36

为此,您有以下方法:

1-每个表有一个参考表,使用视图表示拥有XYZ:

代码语言:javascript
复制
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-使用触发器后(插入、更新、删除)每个人,公司和雇员表,以检查完整性。

例如:

代码语言:javascript
复制
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使用稀疏列)

代码语言:javascript
复制
XYZ(ID, TableName, PersonRowId, CompanyRowId, EmployeeRowId)
票数 3
EN

Stack Overflow用户

发布于 2014-07-01 08:46:10

这在很大程度上是一个判断力。正如你所说的,你有三种选择:

使用单个RowID列,但是不能强制执行RI。

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

另一个选项是为每种类型创建一个基表和另一个表。在我看来,这太过分了,因为三个子表的结果是一个Base表加上一个实体的一个!

我的建议是:

代码语言:javascript
复制
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表的FKs。

但我得承认-我一开始就质疑这张桌子的原因.也许你应该先考虑一下这个表是否正确,然后再做进一步的改进。

票数 1
EN

Stack Overflow用户

发布于 2014-07-01 08:41:06

您不需要为表指定表名,Server已经这样做了。

代码语言:javascript
复制
SELECT * FROM sys.tables

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24505831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档