sql-server – 灵活的外键

前端之家收集整理的这篇文章主要介绍了sql-server – 灵活的外键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sql Server数据库.我正在开发一个vb.net应用程序.

现在我想要一个“事件”表,它应该保留与我的数据库相关的所有事件.但是,此表的其中一个字段应该是与此事件必须执行的记录相关的字段ObjectID.但是这个记录可能在不同的表格上.例如 :

>事件1 —-在表客户端上记录25
>事件2 —-记录30张表发票
>活动3 —-记录40篇文章

问题是这个字段ObjectID应该是一个灵活的外键,因为可能与不同的表有关.

有什么办法可以解决这个案子吗?

谢谢 !

解决方法

解决这个问题的一种方法是在数据库添加一个表,使其像其他表的基础一样,并与其他表建立一对一的关系,然后将事件表连接到此基表.
这将允许您保持每个表的数据完整性.
基表可以像一列一样简单,也可以有所有其他表共有的列,从而在数据结构中实现一种“继承”.

创建基表(假设其他表之间没有公共列):

CREATE TABLE TblObjectBase 
(
    ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)

然后,对于需要由Events表中的ObjectId引用的任何其他表:

CREATE TABLE TblClients 
(
    Client_Id int PRIMARY KEY,Client_FirstName varchar(10),Client_LastName varchar(10),--  Other client related data
    CONSTRAINT FK_TblClients_TblObjectBase
               FOREIGN KEY(Client_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

CREATE TABLE TblInvoices
(
    Invoice_Id int PRIMARY KEY,-- other incoice related data
     CONSTRAINT FK_TblInvoices_TblObjectBase
               FOREIGN KEY(Invoice_Id) 
               REFERENCES TblObjectBase(ObjectBase_Id)
)

剩下的唯一事情是为TblObjectBase插入一个新值,用于其他表上的任何插入.这可以通过存储过程或插入触发器轻松实现.
插入过程可能如下所示:

CREATE PROCEDURE Insert_TblClients
(
    @Client_FirstName varchar(10),@Client_LastName varchar(10),-- any other client related data you might have
)
AS
DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

-- Insert the data to the clients table:
INSERT INTO TblClients 
(Client_Id,Client_FirstName,Client_LastName.....) VALUES
(@ClientId,@Client_FirstName,@Client_LastName...)

而不是插入触发器将如下所示:

CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT 
AS
BEGIN

DECLARE @ClientId int

-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;

-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();

INSERT INTO TblClients 
(Client_Id,Client_LastName.....) 
SELECT @ClientId,Client_LastName..... 
FROM inserted

END

如果您选择使用而不是插入,Identity值来自另一个表的事实应该对客户端(您的vb.net程序)透明.

猜你在找的MsSQL相关文章