Первичный ключ SQL для 2 таблиц - PullRequest
1 голос
/ 18 сентября 2011

У меня есть две таблицы (Компания и Персоны) в моей системе бронирования (это ВИДЫ КЛИЕНТА, которые у меня есть).

СТОЛ КОМПАНИИ

-CompanyID
**-CompanyName**
-Fname
-Lname
-Street
-City
-ContactNo

СТОЛ ЧЕЛОВЕКА

-PersonID
-Fname
-Lname
-Street
-City
-ContactNo

Их единственное отличие - КОМПАНИЯ.

Тогда каждая транзакция может быть либо КОМПАНИЕЙ, либо ЛИЦОМ ..

Стол резервирования

-ReservationNo
-ClientID

Как мне вставить значение для ClientID?

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Вы должны объединить «СТОЛ КОМПАНИИ» и «СТОЛ ЧЕЛОВЕКА» в «СТОЛ КЛИЕНТОВ»:)

-ClientID
-Fname
-Lname
-Street
-City
-ContactNo

и создайте «СТОЛ КОМПАНИИ» с помощью

-CompanyID
**-CompanyName**
-ClientID

и создайте «СТОЛ ЧЕЛОВЕКА» с помощью

-PersonID
-ClientID

OR

вы объединяете "СТОЛ КОМПАНИИ" и "СТОЛ ЧЕЛОВЕКА" в "СТОЛ КЛИЕНТОВ" со значениями NULL, как это

-ClientID
-PersonID (can be NULL)
-CompanyID (can be NULL)
**-CompanyName** (can be NULL or empty)
-Fname
-Lname
-Street
-City
-ContactNo

Если вам не требуется сопоставление из PersonID / CompanyID для обратной совместимости с другими таблицами, то вам следует удалить столбцы PersonID / CompanyID (и всю таблицу «PERSONS TABLE» для первого случая, который я упомянул). Впоследствии вы можете идентифицировать строки вашей компании с помощью «CompanyName NOT IS NULL».

Если вы не хотите объединять таблицы, подумайте над ответом "Damien_The_Unbeliever".

Но я думаю, что вам определенно следует объединить эти две "таблицы людей".

1 голос
/ 18 сентября 2011

Если эти две возможности, вероятно, никогда не изменятся, то, вероятно, будет достаточно пары обнуляемых столбцов (с соответствующими внешними ключами):

CREATE TABLE Reservations (
    ReservationNo int not null,
    PersonID int null,
    CompanyID int null,
    /* Other columns */
    constraint CK_Reservations_PersonOrCompany CHECK
      ((CompanyID is null or PersonID is null) and COALESCE(CompanyID,PersonID) is not null),
    /* Other constraints */
)

Если есть вероятность, что будет больше клиентов, тогда введитетаблица клиента:

CREATE TABLE Clients (
    ClientID int not null,
    ClientType varchar(10) not null,
    /* Common columns for all client types */
    constraint PK_Clients PRIMARY KEY (ClientID),
    constraint UQ_Client_TypeCheck UNIQUE (ClientID,ClientType),
    constraint CK_Client_ClientTypes CHECK
        (ClientType in ('PERSON','COMPANY')) --Add more types later
     /* Other constraints */
)

Затем в каждой таблице типов клиентов задайте правильный тип клиента:

CREATE TABLE Persons (
    ClientID int not null,
    ClientType as CONVERT(varchar(10),'PERSON'),
     /* Columns unique to person client types */
    constraint PK_Persons PRIMARY KEY (ClientID),
    constraint FK_Persons_Clients FOREIGN KEY (ClientID) references Clients,
    constraint FK_Person_ClientTypeCheck FOREIGN KEY (ClientID,ClientType)
         references Clients (ClientID,ClientType)
    /* Other constraints */
)

И, при необходимости, повторите для других таблиц.

1 голос
/ 18 сентября 2011

Вы можете добавить еще один столбец в таблице бронирования с указанием типа клиента (компания / человек). Тогда ClienID может быть PersonID / CompanyID. Выполнение объединения для определения, соответствует ли clientID человеку или компании, не является хорошим дизайном

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...