是否适合此方案的一对一关系?

时间:2011-12-13 14:27:49

标签: sql-server database database-design

我想知道一对一关系是否适合以下情况:

我有一个查找表,包含两列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 个答案:

答案 0 :(得分:1)

从数据库的角度来看,这是一个1:M的关系。用于取消激活记录的逻辑对RDBMS没有意义。当然,除非您打算将它们移至历史记录表,但从您的StartDateEndDate判断,您将不会。

您可能希望为RefTrackingNumber创建代理键,然后将ID中的RefTrackingNumber字段更改为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;