sql >> Databáze >  >> RDS >> Sqlserver

Flexibilní cizí klíč

Jedním ze způsobů, jak to vyřešit, by bylo přidat do databáze tabulku, která by fungovala jako základ pro ostatní tabulky a propojit ji vztahem jedna ku jedné k ostatním tabulkám, a pak připojit tabulku událostí k této základní tabulce.
To vám umožní zachovat integritu dat pro každou z tabulek.
Základní tabulka může být tak jednoduchá jako jeden sloupec, nebo může mít sloupce, které mají všechny ostatní tabulky společné, čímž se implementuje určitý druh " dědičnost“ ve vaší datové struktuře.

Vytvořte základní tabulku (za předpokladu, že mezi ostatními tabulkami nejsou žádné společné sloupce):

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

Potom pro jakoukoli jinou tabulku, na kterou je třeba odkazovat pomocí ObjectId v Events tabulka:

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)
)

Jediné, co zbývá, je vložit novou hodnotu do TblObjectBase pro jakékoli vložení na vaše ostatní tabulky. Toho lze snadno dosáhnout buď uloženými procedurami, nebo místo triggerů vložení.
Procedura vložení může vypadat takto:

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...)

Spouštěč namísto vložení by vypadal takto:

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_FirstName, Client_LastName.....) 
SELECT @ClientId, Client_FirstName, Client_LastName..... 
FROM inserted

END

Pokud se rozhodnete použít místo insert, skutečnost, že hodnota Identity pochází z jiné tabulky, by měla být pro klienta (váš program vb.net) transparentní.



  1. SQL Server Změna umístění souboru TempDB

  2. Proč je důležité omezit přístup uživatelů k vaší databázi

  3. Posouvání určitých záznamů na konec běhu se stejným datem

  4. Python db-api:fetchone vs fetchmany vs fetchall