2011-09-18 2 views
1

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

КОМПАНИЯ ТАБЛИЦА

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

ЛИЦА ТАБЛИЦА

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

Их единственное отличие заключается в COMPANYNAME.

Тогда каждая сделка может быть либо физическим или юридическим лицом ..

Заказ столиков

-ReservationNo 
-ClientID 

Как я могу вставить значение ClientID?

+0

Что вы подразумеваете под вставкой значения для ClientID? Является ли ClientID поле в таблице компаний/лиц, которое вы пропустили? –

ответ

1

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

+0

Спасибо за ваш ответ! Ваш ответ будет одинаковым с другими форумами, я буду считать это! Благодаря! :) – TheOxblood

1

Вы должны слиться «COMPANY TABLE» и «лица, таблицы», «КЛИЕНТЫ TABLE» :)

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

и создать "КОМПАНИЯ СТОЛ" с

-CompanyID 
**-CompanyName** 
-ClientID 

и создать "Лица стол" с

-PersonID 
-ClientID 

ИЛИ

объединение "COMPANY TABLE" и "лица, таблицы", "КЛИЕНТЫ" TABLE с 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 (и весь «ТАБЛИЦЫ ПЕРСОНА» для первого случая, о котором я упоминал). После этого вы можете определить строки своей компании с «CompanyName NOT IS NULL».

Если вы не хотите объединять таблицы, рассмотрите ответ «Damien_The_Unbeliever».

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

+2

Зачем вводить больше 'ID' в таблицах компаний и людей? Конечно, для идентификации их достаточно «ClientID». –

+0

Вы правы, это раздражает. Я думал о других таблицах в системе, которые уже используют PersonID и CompanyID. Я исправлю свой ответ, чтобы все было ясно ... – b2ag

+0

Возможно, я создам еще один столбец для таблицы бронирования для идентификации Клиента (Компании или Лица) для каждой транзакции. – TheOxblood

1

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

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 */ 
) 

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

+0

Я ценю ваш ответ! Благодаря! :) – TheOxblood