在SQL Server中设计一个条件数据库关系

23 浏览
0 Comments

在SQL Server中设计一个条件数据库关系

我有三种基本实体:人、企业和资产。每个资产只能归属于一个人或企业。每个人和企业可以拥有0到多个资产。在Microsoft SQL Server中,存储这种条件关系的最佳实践是什么?

我的初步计划是在资产表中有两个可为空的外键,一个用于人,一个用于企业。其中一个值将为空,另一个将指向所有者。我看到这种设置的问题是它需要应用程序逻辑才能解释和执行。这真的是最好的解决方案吗?还有其他选择吗?

0
0 Comments

在SQL Server中设计条件数据库关系的原因是为了解决在数据库中处理不同类型实体之间关系的问题。具体而言,问题是如何在数据库中设计一个关系,使得一个实体可以是另一个实体的父类或子类。

为了解决这个问题,可以使用超类型和子类型的概念。首先,创建一个PartyType和Party表,PartyType表用于定义不同类型的实体,Party表用于存储实体的共享属性。

PartyType表的结构如下:

CREATE TABLE dbo.PartyType (
   PartyTypeID int NOT NULL identity(1,1) CONSTRAINT PK_PartyType PRIMARY KEY CLUSTERED,
   Name varchar(32) CONSTRAINT UQ_PartyType_Name UNIQUE
);
INSERT dbo.PartyType VALUES ('Person'), ('Business');

Party表的结构如下:

CREATE TABLE dbo.Party (
   PartyID int identity(1,1) NOT NULL CONSTRAINT PK_Party PRIMARY KEY CLUSTERED,
   FullName varchar(64) NOT NULL,
   BeginDate smalldatetime,
   PartyTypeID int NOT NULL CONSTRAINT FK_Party_PartyTypeID FOREIGN KEY REFERENCES dbo.PartyType (PartyTypeID)
);

接下来,根据不同类型的实体,创建相应的子类型表。例如,如果有一些特定于个人的属性,可以创建一个Person表:

CREATE TABLE dbo.Person (
   PersonPartyID int NOT NULL CONSTRAINT PK_Person PRIMARY KEY CLUSTERED CONSTRAINT FK_Person_PersonPartyID FOREIGN KEY REFERENCES dbo.Party (PartyID) ON DELETE CASCADE
);

如果有一些特定于企业的属性,可以创建一个Business表:

CREATE TABLE dbo.Business (
   BusinessPartyID int NOT NULL CONSTRAINT PK_Business PRIMARY KEY CLUSTERED CONSTRAINT FK_Business_BusinessPartyID FOREIGN KEY REFERENCES dbo.Party (PartyID) ON DELETE CASCADE
);

最后,创建一个Asset表来存储与实体相关的资产信息:

CREATE TABLE dbo.Asset (
   AssetID int NOT NULL identity(1,1) CONSTRAINT PK_Asset PRIMARY KEY CLUSTERED,
   PartyID int NOT NULL CONSTRAINT FK_Asset_PartyID FOREIGN KEY REFERENCES dbo.Party (PartyID),
   AssetTag varchar(64) CONSTRAINT UQ_Asset_AssetTag UNIQUE
);

这样,Party表与Business和Person表之间的关系是“一对零或一”的关系。通过这种设计,可以方便地处理不同类型实体之间的关系,同时保持数据库的一致性和完整性。

此外,为了进一步优化设计,可以考虑以下几点:

- 可以在子类型表中添加PartyTypeID列,并将其作为主键和外键,以确保PartyTypeID的一致性。

- 可以启用级联删除,以便在删除子类型表中的记录时同时删除父类型表中的对应记录。

- 可以在子类型表上创建触发器,以处理对父类型表的删除操作,以确保父类型表中不会存在没有对应子类型表的记录。

总之,通过使用超类型和子类型的设计模式,可以解决在SQL Server中处理条件数据库关系的问题,并提高数据库的灵活性和可维护性。

0
0 Comments

在设计SQL Server中的条件数据库关系时,可能会出现的问题是如何处理实体之间的关系。在当前项目中,有两个实体,即个人和企业,它们都与另一个实体"Party"存在关联。个人和企业都有一个指向Party的外键(is-a关系),而资产可能也有一个指向Party的外键(belongs to关系)。

然而,如果将来一个资产可以被多个实例共享,最好的做法是创建多对多的关系,这样可以提供更大的灵活性,但同时也会增加应用程序逻辑和查询的复杂性。

感谢您对这个问题的建议。这是一个正确的处理方法。

0
0 Comments

问题出现的原因是需要在SQL Server中设计一个有条件的数据库关系。具体来说,需要在两个列(PeopleID和BusinessID)中只允许一个列的值为空,而另一个列的值非空。

解决方法是使用一个检查约束(check constraint),具体代码如下:

(PeopleID is null and BusinessID is not null) or (PeopleID is not null and BusinessID is null)

作者表示,他喜欢你的检查约束比他自己的更好,因为你的版本更容易扩展到任意数量的列上,只需要添加一个子表达式即可。而他的版本在从5列扩展到6列时需要修改每个子表达式。

0