Связь один-к-одному с nullable значениями
От: Darooma Россия  
Дата: 17.01.12 18:32
Оценка:
Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.
Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
Re: Связь один-к-одному с nullable значениями
От: Softwarer http://softwarer.ru
Дата: 17.01.12 18:55
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.

D>Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?

Никак, поскольку это не связь один к одному. А то, что Вы хотите, делается так:

create table Users(UserID integer, CustomerID integer);
alter table Users add constraint Users_PK primary key(UserID);
alter table Users add constraint Users_Customers_FK foreign key(CustomerID) references Customers(CustomerID);
alter table Users add constraint Users_Customer_UK unique(CustomerID);
Re[2]: Связь один-к-одному с nullable значениями
От: Darooma Россия  
Дата: 17.01.12 19:45
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Здравствуйте, Darooma, Вы писали:


D>>Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.

D>>Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?

S>Никак, поскольку это не связь один к одному. А то, что Вы хотите, делается так:


S>
create table Users(UserID integer, CustomerID integer);
S>alter table Users add constraint Users_PK primary key(UserID);
S>alter table Users add constraint Users_Customers_FK foreign key(CustomerID) references Customers(CustomerID);
S>alter table Users add constraint Users_Customer_UK unique(CustomerID);


Тут будет разрешен только один NULL на всю таблицу. Мне это не подходит.
Re: Связь один-к-одному с nullable значениями
От: . Великобритания  
Дата: 17.01.12 21:27
Оценка: +1
Здравствуйте, Darooma, Вы писали:

D> Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.

D> Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
сделать связь в другую сторону.
create table User(id integer);
create table Customer(id integer, userId integer);
ALTER TABLE ONLY User
    ADD CONSTRAINT user_pkey PRIMARY KEY (id);
ALTER TABLE ONLY Customer
    ADD CONSTRAINT customer_pkey PRIMARY KEY (id);
ALTER TABLE ONLY Customers
    ADD CONSTRAINT customer_userId_unique UNIQUE (userId);
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Связь один-к-одному с nullable значениями
От: Darooma Россия  
Дата: 18.01.12 02:35
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, Darooma, Вы писали:


D>> Есть 2 таблицы: Users и Customers. У пользователя может быть только один customer, а может вообще не быть.

D>> Как организовать связь один-к-одному между этими таблцами, чтобы в таблице Users допускались значения null для ключа, который ссылается на таблицу Customers?
.>сделать связь в другую сторону.
.>
.>create table User(id integer);
.>create table Customer(id integer, userId integer);
.>ALTER TABLE ONLY User
.>    ADD CONSTRAINT user_pkey PRIMARY KEY (id);
.>ALTER TABLE ONLY Customer
.>    ADD CONSTRAINT customer_pkey PRIMARY KEY (id);
.>ALTER TABLE ONLY Customers
.>    ADD CONSTRAINT customer_userId_unique UNIQUE (userId);
.>

Не вижу ни внешнего ключа между таблицами, ни возможности добавлять Null значения в customer_userId_unique
Re[3]: Связь один-к-одному с nullable значениями
От: Softwarer http://softwarer.ru
Дата: 18.01.12 06:14
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Тут будет разрешен только один NULL на всю таблицу. Мне это не подходит.


Плюньте в лицо тому, кто Вам сказал такую глупость. Либо выбросьте нафиг СУБД, не поддерживающую основы ANSI стандарта (помнится, этим грешил MS SQL, неужели до сих пор не исправили?). Либо подумайте, как доработать эту схему для такой СУБД (это не сложно).
Re[4]: Связь один-к-одному с nullable значениями
От: daw Россия  
Дата: 18.01.12 07:47
Оценка:
> помнится, этим грешил MS SQL, неужели до сих пор не исправили?

и не собираются даже.
http://connect.microsoft.com/SQLServer/feedback/details/514312/treat-null-as-standard-sql-null-instead-unknown-value

зы: это я не для заведения дискуссии. лично я согласен — стандарт нарушается.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Связь один-к-одному с nullable значениями
От: rm822 Россия  
Дата: 18.01.12 08:05
Оценка: 113 (3)
D>Тут будет разрешен только один NULL на всю таблицу. Мне это не подходит.
filtered indexes
alter table Users add constraint Users_Customer_UK unique(CustomerID) where CustomerID is not null
Re[3]: Связь один-к-одному с nullable значениями
От: . Великобритания  
Дата: 18.01.12 10:09
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Не вижу ни внешнего ключа между таблицами,

Да, забыл. Ключ Customer.userId->User.id очевидно.

D>ни возможности добавлять Null значения в customer_userId_unique

Так не надо null! Вообще поле userId not null надо объявить. Связь же в обратную сторону. Если Customer-а нет, то просто нет записи, и никто не ссылается на User-а.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Связь один-к-одному с nullable значениями
От: Softwarer http://softwarer.ru
Дата: 18.01.12 10:29
Оценка:
Здравствуйте, daw, Вы писали:

daw>и не собираются даже.


Странно. Раньше они вроде такое делали через переключатели вроде SET ANSI_NULLS.
Re[4]: Связь один-к-одному с nullable значениями
От: Softwarer http://softwarer.ru
Дата: 18.01.12 10:38
Оценка:
Здравствуйте, ., Вы писали:

.> Связь же в обратную сторону. Если Customer-а нет, то просто нет записи,


Это... сильное требование. Представьте, например, что эта связь имеет смысл "сотрудник, отвечающий за этого клиента". Вы всерьёз предлагаете удалять записи клиентов, по каким-либо причинам оставшихся без ответственного сотрудника?
Re[4]: Связь один-к-одному с nullable значениями
От: Darooma Россия  
Дата: 18.01.12 11:20
Оценка: -1
Здравствуйте, rm822, Вы писали:

D>>Тут будет разрешен только один NULL на всю таблицу. Мне это не подходит.

R>filtered indexes
R>
R>alter table Users add constraint Users_Customer_UK unique(CustomerID) where CustomerID is not null
R>

Такое ощущение, что кругом одни дураки. Советуют либо уникальный индекс без Null'a, либо ключ, допускающий null, но со связью один-ко-многим.
Re[5]: Связь один-к-одному с nullable значениями
От: . Великобритания  
Дата: 18.01.12 20:29
Оценка:
Здравствуйте, Softwarer, Вы писали:

S> Это... сильное требование. Представьте, например, что эта связь имеет смысл "сотрудник, отвечающий за этого клиента". Вы всерьёз предлагаете удалять записи клиентов, по каким-либо причинам оставшихся без ответственного сотрудника?

А, в смысле есть есть Юзер, есть Кастомер. И некоторые юзеры имеют ссылку на разных кастомеров? Тогда третья табличка-связь:
create table UserCustomer(userId, customerId);
ALTER TABLE ONLY UserCustomer
    ADD CONSTRAINT userCustomer_userId_unique UNIQUE (userId);
ALTER TABLE ONLY UserCustomer
    ADD CONSTRAINT userCustomer_customerId_unique UNIQUE (customerId);
ALTER TABLE ONLY UserCustomer
    ADD CONSTRAINT userCustomer_customerId_pk PRIMARY KEY (userId, customerId);
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.