2011-12-13 51 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;