2011-12-13 50 views
0

我在想,如果一比一的關係是適用於以下情形:是否適合此場景的1對1關係?

我有由兩列,ID和TrackingNumber,它保持跟蹤號碼的清單(電話號碼使用的查找錶轉發)。我們還有一個包含我們客戶電話號碼的現有表格。

我們希望偶爾跟蹤某些電話號碼,並將它們鏈接到一個跟蹤號碼。發生這種情況時,確定跟蹤的開始和結束日期。一旦結束日期過去了,我們希望該行保留在表格中,但被標記爲不活動。原因是,如果該客戶將來需要重新追蹤,我們希望在可能的情況下重新使用相同的追蹤號碼。

首先填充TrackingNumber表,但RefTrackingNumber表不會。我們還可能在將來添加更多條目到TrackingNumber表中。我意識到,一種選擇是隻有一個表,但這需要先刪除NOT NULL約束。

我能拿出最好的解決辦法是爲這個職位以下的例子:Defining a one-to-one relationship in SQL Server

有沒有更好的辦法?

謝謝。

CREATE TABLE TrackingNumber (
    ID int PRIMARY KEY, 
    TrackingNumber varchar(20) 
) 


CREATE TABLE RefTrackingNumber (
    ID int PRIMARY KEY, 
    RefPhoneNumber int NOT NULL, 
    StartDate datetime NOT NULL, 
    EndDate datetime NOT NULL, 
    Active bit NOT NULL 
) 

ALTER TABLE RefTrackingNumber 
    ADD FOREIGN KEY (ID) REFERENCES TrackingNumber(ID) 
+1

如果你不想多RefTrackingNumber記錄引用一個TrackingNumber,那麼你的一對一一個沒關係。 –

回答

1

從數據庫的角度來看,這是1:M的關係。用於停用記錄的邏輯對於RDBMS沒有意義。除非你打算把它們移到歷史表,但是從你的StartDateEndDate來判斷你不會。

你可能想創建一個代理鍵爲RefTrackingNumber,然後在RefTrackingNumber改變你的ID領域TrackingNumberID。它應該是這樣的:

CREATE TABLE TrackingNumber (
    ID int PRIMARY KEY, 
    TrackingNumber varchar(20) 
) 


CREATE TABLE RefTrackingNumber (
    ID int IDENTITY(1, 1) PRIMARY KEY, 
    TrackingNumberID int NOT NULL, 
    RefPhoneNumber int NOT NULL, 
    StartDate datetime NOT NULL, 
    EndDate datetime NOT NULL, 
    Active bit NOT NULL 
) 

ALTER TABLE RefTrackingNumber 
    ADD FOREIGN KEY (TrackingNumberID) REFERENCES TrackingNumber(ID) 

您可以創建一個VIEW與當前參考號碼的工作:

CREATE VIEW CurrentRefTrackingNumber AS 
SELECT ID, TrackingNumberID, RefPhoneNumber 
FROM RefTrackingNumber 
WHERE GETDATE() BETWEEN StartDate AND EndDate 
    AND Active = 1;