Подходит ли отношение 1 к 1 для этого сценария? - PullRequest
0 голосов
/ 13 декабря 2011

Мне было интересно, подходит ли отношение один-к-одному для следующего сценария:

У меня есть справочная таблица, состоящая из двух столбцов, ID и TrackingNumber, которая содержит список номеров отслеживания (телефонномера, используемые для пересылки).У нас также есть таблица с телефонными номерами наших клиентов.

Мы хотели бы иногда отслеживать определенные номера телефонов, связывая их с номером отслеживания.Когда это происходит, определяется дата начала и окончания отслеживания.По истечении срока окончания мы хотели бы, чтобы эта строка оставалась в таблице, но была помечена как неактивная.Причина этого заключается в том, что если в будущем этот клиент потребует повторного отслеживания, мы хотели бы повторно использовать тот же номер отслеживания, если это возможно.

Для начала будет заполнена таблица TrackingNumber, но таблица RefTrackingNumberне будет.В будущем мы также можем добавить дополнительные записи в таблицу TrackingNumber.Я понимаю, что один из вариантов - просто иметь одну таблицу, но для этого потребуется удалить ограничения NOT NULL для начала.

Лучшее решение, которое я могу придумать, это следующий пример для этого поста: Определение отношения один-к-одному в 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 Ответ

1 голос
/ 13 декабря 2011

Это отношение 1: M с точки зрения базы данных. Ваша логика для инактивации записей не имеет значения для РСУБД. Если, конечно, вы не планируете переместить их в таблицу истории, но, судя по вашим StartDate и EndDate, вы не будете.

Возможно, вы захотите создать суррогатный ключ для 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;
...