Покритикуйте решение
От: -n1l-  
Дата: 15.03.16 14:58
Оценка:
Есть две таблицы, связанные один к одному.
Как например офис и город.
Предполагается, что офис может быть либо в одном городе либо во всех городах.

Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.
Как вам?
Re: Покритикуйте решение
От: Sharov Россия  
Дата: 15.03.16 15:03
Оценка:
Здравствуйте, -n1l-, Вы писали:


N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

Ужасно -- это не реляционный подход. У Вас связь один-ко-многим, вот и делайте ее.
Кодом людям нужно помогать!
Re: Покритикуйте решение
От: Milena США  
Дата: 15.03.16 15:08
Оценка: :)
Здравствуйте, -n1l-, Вы писали:

N>Есть две таблицы, связанные один к одному.

N>Как например офис и город.
N>Предполагается, что офис может быть либо в одном городе либо во всех городах.

N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL. Я рекомендую использовать ID = 0 (All)
Re[2]: Покритикуйте решение
От: Alex.Che  
Дата: 15.03.16 15:13
Оценка:
> Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.

читайте BOL и не городите чушь.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Покритикуйте решение
От: -n1l-  
Дата: 15.03.16 15:14
Оценка:
Здравствуйте, Milena, Вы писали:

M>Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL. Я рекомендую использовать ID = 0 (All)


Ай ну короче это самопильный черезжопный FK, он может быть null

Мне нужны доводы, что бы переубедить.
И если я правильнео понял, вы предлагаете все таки делать какое-то значение, что бы однозначно идентифицировать "все города"?
Re[2]: Покритикуйте решение
От: -n1l-  
Дата: 15.03.16 15:16
Оценка:
Давайте представим, что связь 1-1, т.е. либо все города(Ниче нет, налл) либо город есть.
Re[3]: Покритикуйте решение
От: Alex.Che  
Дата: 15.03.16 15:20
Оценка: +1
> Мне нужны доводы, что бы переубедить.

почему бы и нет, собственно говоря...

--
Нет у вас методов против Кости Сапрыкина! (С)
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Покритикуйте решение
От: -n1l-  
Дата: 15.03.16 15:23
Оценка:
Здравствуйте, Alex.Che, Вы писали:
AC>читайте BOL и не городите чушь.

Это что?)
Re[3]: Покритикуйте решение
От: -n1l-  
Дата: 15.03.16 15:26
Оценка:
Ой, 1-многим, но лишь два выбора, либо есть null либо есть value
Re[3]: Покритикуйте решение
От: Milena США  
Дата: 15.03.16 15:42
Оценка:
Здравствуйте, Alex.Che, Вы писали:

>> Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.


AC>читайте BOL и не городите чушь.


OK, читаем BOL — прямо вот тут https://msdn.microsoft.com/en-us/library/ms189039.aspx#Restrictions.

Limitations and Restrictions
A table can contain only one PRIMARY KEY constraint.
All columns defined within a PRIMARY KEY constraint must be defined as NOT NULL. If nullability is not specified, all columns participating in a PRIMARY KEY constraint have their nullability set to NOT NULL.


Где чушь?
Re: Покритикуйте решение
От: Иль  
Дата: 15.03.16 16:01
Оценка: +2
Здравствуйте, -n1l-, Вы писали:

N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

А как это будет использоваться?

Искать офисы в заданном городе не потребуется? А если потребуется, то как вы будете это делать?

А во вторых потому что система имеет неприятное свойство развиваться со временем. Через какое-то время окажется что офис уже планируется, а с городом ещё не вполне определились (и для данного случая как раз потребуется NULL во внешнем ключе, который вы уже таким нестандартным способом задействовали) и/или что таки есть такие офисы, которые таки в нескольких городах, но не во всех.

Поэтому сделать, конечно, можно как угодно, но я бы лично остерёгся использовать такое нестандартное решение.
Отредактировано 15.03.2016 16:02 Иль . Предыдущая версия .
Re: Покритикуйте решение
От: Softwarer http://softwarer.ru
Дата: 15.03.16 16:05
Оценка: +4
Здравствуйте, -n1l-, Вы писали:

N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

Во-первых, "офис во всех городах" — это нечто не соответствующее реальности. Это мешает хорошему ответу, поскольку рождает противоречие между имеющимся опытом и требованиями задачи. Лучше давайте реальную задачу, шанс разумного ответа гораздо выше.

Во-вторых, с точки зрения красоты схемы лучше развернуть fk, сделать его из городов в офисы. Тогда исчезнет причина Вашего вопроса. Но чтобы советовать или не советовать так сделать, нужно посмотреть реальную задачу — например, так не стоит делать, если в будущем в одном городе может появиться несколько офисов.

В целом такое решение допустимо, но коряво. Для студенческой работы сойдёт (хотя зависит от препода), для реальной — вызывает ощущение, что по мере развития задачи и уточнения требований придётся переделать.

S> Ужасно -- это не реляционный подход. У Вас связь один-ко-многим, вот и делайте ее.


У него не связь один ко многим. Разница в том, что в его задаче при появлении нового города он автоматом начнёт обслуживаться офисом "на все города", при связи же один ко многим — нет.

M> Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.


Столь бредовое поведение, насколько я в курсе, было характерно только для древних версий Interbase. Если вдруг где-то такое не выйдет, лучшее, что можно сделать — снести ту фекалию мамонта, в которой не вышло, и использовать вместо неё СУБД.

M> Я рекомендую использовать ID = 0 (All)


Вот сослаться через FK на отсутствующую запись с id = 0 действительно не выйдет в большинстве СУБД, придётся вставлять левый город "Все" с id = 0. А этот подход — охрененной производительности генератор сложных багов в production обстановке. Такие ошибки склонны проходить этап тестирования и спустя продолжительное время "стрелять" у пользователя. Я в своей практике имел дело с единственной системой, выполненной в подобной архитектуре, и из всех проблем, которые пришлось решать, минимум треть — причём, самая гадская треть — была следствием именно этого трям-трям-трям очень умного решения.
Re: Покритикуйте решение
От: Olaf Россия  
Дата: 15.03.16 16:37
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Есть две таблицы, связанные один к одному.

N>Как например офис и город.
N>Предполагается, что офис может быть либо в одном городе либо во всех городах.

N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

Ваше решение вполне может быть жизнеспособным и решать поставленную задачу, но чтобы дать ему правильную оценку необходимо понять, а какая собственно задача решается. У меня это решение вызывает некоторые сомнения:
1. Вообще Null означает отсутствие данных
2. Значение Null идентичное значению "Все города" совершенно не очевидно для остальных разработчиков. Хотя возможно ваша система хорошо документируется и преемственность кода не является проблемой.
3. А как собственно писать запросы к такой схеме, т.е. соединять данные? Необходимо будет оборачивать Null значение, использовать ИЛИ в условиях поиска, как результат — возможно неэффективное построение плана запроса, parameter sniffing, пропуск индексов и т.п. Хотя возможно у вас там всего 20 значений и о больших объемах речи не идет.
4. Как правильно заметили выше, данный поход создает проблему роста. Т.е. возможно завтра у вас требования изменятся и необходимо будет хранить офисы, которые пока не расквартированы по городам.
Re[4]: Покритикуйте решение
От: paucity  
Дата: 15.03.16 16:41
Оценка:
Здравствуйте, Milena, Вы писали:

M>> Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.


M>OK, читаем BOL — прямо вот тут https://msdn.microsoft.com/en-us/library/ms189039.aspx#Restrictions.


Good Job

M>Где чушь?


пеперь, ну хотя бы там же, читаем про FK
Re[2]: Покритикуйте решение
От: Olaf Россия  
Дата: 15.03.16 16:54
Оценка:
Здравствуйте, Milena, Вы писали:

M>Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL. Я рекомендую использовать ID = 0 (All)


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

В таблице офисов, автор не заполняет FK для города, т.е. оставляет его равным null. При этом таблица городов у него заполнена и для каждой записи есть свой PK конечно не равный null. Формально — это отношение один к нулю или одному (1-0...1), т.е. когда дочерняя сущность является не обязательной и может не существовать, при этом родительская всегда существует.
Re[5]: Покритикуйте решение
От: Milena США  
Дата: 15.03.16 18:08
Оценка: +1 -1
Здравствуйте, paucity, Вы писали:

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


M>>> Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.


M>>OK, читаем BOL — прямо вот тут https://msdn.microsoft.com/en-us/library/ms189039.aspx#Restrictions.


P>Good Job


M>>Где чушь?


P>пеперь, ну хотя бы там же, читаем про FK


Ну если вместо PK создать UNIQUE CLUSTERED INDEX с NULL value, и на него направить FK, а также отдельно создать некий фэйковый PK, который будет NONCLUSTERED, то это, конечно, будет офигенно круто
Re[2]: Покритикуйте решение
От: Milena США  
Дата: 15.03.16 18:13
Оценка:
Здравствуйте, Softwarer, Вы писали:

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


N>>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>>Как вам?

M>> Я рекомендую использовать ID = 0 (All)


S>Вот сослаться через FK на отсутствующую запись с id = 0 действительно не выйдет в большинстве СУБД, придётся вставлять левый город "Все" с id = 0. А этот подход — охрененной производительности генератор сложных багов в production обстановке. Такие ошибки склонны проходить этап тестирования и спустя продолжительное время "стрелять" у пользователя. Я в своей практике имел дело с единственной системой, выполненной в подобной архитектуре, и из всех проблем, которые пришлось решать, минимум треть — причём, самая гадская треть — была следствием именно этого трям-трям-трям очень умного решения.


Я собственно рекомендовала просто не использовать NULL, и если уж ставить грабли, то хотя бы сделать фэйковое числовое значение, чтобы не морочить голову обработкой NULL и проблемами с PK.
Я согласна с тем, что это не оптимальное решение, но иногда, если таблица используется ТОЛЬКО для репортов, это будет работать быстрее. Если таблица используется повсеместно, то лучше изначально сделать грамотный дизайн с нормальными ключами и приложение, которое будет эти ключи правильно обновлять.
Re[6]: Покритикуйте решение
От: paucity  
Дата: 15.03.16 20:36
Оценка: +1
Здравствуйте, Milena, Вы писали:

P>>пеперь, ну хотя бы там же, читаем про FK


When a value other than NULL is entered into the column of a FOREIGN KEY constraint, the value must exist in the referenced column; otherwise, a foreign key violation error message is returned.


M>Не выйдет. FK всегда ссылается на PK, а PK не может содержать NULL.
Отредактировано 15.03.2016 20:40 paucity . Предыдущая версия .
Re: Покритикуйте решение
От: wildwind Россия  
Дата: 16.03.16 06:46
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Предполагается, что офис может быть либо в одном городе либо во всех городах.


А "офис во всех городах" это как? Может "офис на все города"?

N>Решение, сделать fk = null для офиса который расположен во всех городах и fk = value для офиса в одном городе.

N>Как вам?

Нормально.
Re[3]: Покритикуйте решение
От: wildwind Россия  
Дата: 16.03.16 06:47
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Давайте представим, что связь 1-1, т.е. либо все города(Ниче нет, налл) либо город есть.


Это называется связь 1:(0,1).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.