|
|
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Проектирование БД. Хотелось бы на моем простом примере разобраться с типичной ситуацией, которая периодически возникает при проектировании БД. Фактически я не до конца понимаю, когда, в каких случаях на практике применяют связь один-к-одному. Вот, например, есть такой пример "наследования". Очень похожая задача сейчас стоит по работе: Есть женщины, у них есть столбцы, которые могут иметь отношение только к женщине. Есть мужчины, у них есть столбцы, которые могут быть только у мужчин. А есть такие столбцы, которые могут быть и у мужчин и у женщин. Есть 2 решения: 1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нуллов. Это немного смущает. Возможно, это не совсем правильное решение. 2. Можно сделать 3 таблицы: люди, мужчины, женщины. У таблиц "люди" и "мужчины" будет связь один к одному; и у таблиц "люди" и "женщины" будет связь один к одному. Вопрос: какое решение из двух более правильное? И что когда применяется? P.S. Связь один к одному собираюсь делать так: первичный ключ "мужиков" он же является внешним ключом на "людей". Первичный ключ людей - автоинкремент. Все верно? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 13:46 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenov1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нулловНе только Еще получаем необходимость проверок типа Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 13:56 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
1. Большое количество пустых полей в таблице вас сильно смущать не должно. Современные СУБД неплохо их обжимают. 2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 13:59 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
OrtogonХотя не совсем понял, зачем вам внешний ключдля того, чтобы обеспечить следующее:Ortogonзначение первичного ключа в ней всегда равно первичному ключу в таблице "люди" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:04 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
ПаганельOrtogonХотя не совсем понял, зачем вам внешний ключдля того, чтобы обеспечить следующее:Ortogonзначение первичного ключа в ней всегда равно первичному ключу в таблице "люди" lavrenovP.S. Связь один к одному собираюсь делать так: первичный ключ "мужиков" он же является внешним ключом на "людей". Первичный ключ людей - автоинкремент. Все верно? Тогда уж первичный ключ "людей" должен быть внешним на первичном в "мужиках". В таблице "люди" внешних ключей на "мужиков" не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:11 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
А, вот Вы о чем Видимо, автор направляет FK все-таки в нужную сторону, только словами это невнятно выразил Бывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:14 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
ПаганельА, вот Вы о чем Видимо, автор направляет FK все-таки в нужную сторону, только словами это невнятно выразил Бывает Да, наверное. Я просто хотел отметить, что если связка один к одному, не стоит делать еще дополнительные поля со ссылкой на другие таблицы. Хотя это наверное очевидно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:29 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Ortogon 2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает. Хорошо. Спасибо. Но не до конца понимаю, зачем делать вьюхи для каждого из полов? Чтобы в эти вьюхи потом удобно было делать апдейты и инсерты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:31 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Лишние нуллы займет меньше места чем лишние PK у дочерних таблиц. Да и прозрачность работы и скорость будут выше. 1-й вариант таки лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:31 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenovOrtogon 2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает. Хорошо. Спасибо. Но не до конца понимаю, зачем делать вьюхи для каждого из полов? Чтобы в эти вьюхи потом удобно было делать апдейты и инсерты? Чтобы в одном месте прописать правила работы с полями, в данном случае в зависимости от пола. И работать с этой структурой, не нужно постоянно о них помнить и они всегда будут выполнятся. Хотя я тоже склоняюсь к первому варианту. Дублирующие индексы у вас сожрут больше места, чем пустые поля. Разделение на несколько таблиц оправдано, ИМХО, когда вам нужно разграничить доступ к разным атрибутам, а СУБД или конкретная программа не поддерживает права на уровне поля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 14:55 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenov, Тут проектировщик стоит перед выбором в плане оптимальности. Например, Решение 2 выглядит более адекватно в логическом плане, поскольку если свойство отсутсвует, то луче чтобы его структурно не было возможности внести в принципе. Это своего рода ограничение целостности. Но таблиц больше. Кроме того, из соображений упрощения поддержки ограничений целостности, возможно, наоборот, в таблице Люди сделать внешние на женщин и мужчин, поскольку в этом случае легче организовать ограничение на то, чтобы чел не оказался и мужчиной и женщиной( правда тада появится Нуллы, в этих колонках). Но, например, ограничением на значение можно добиться, чтобы не был не Нулл на обоих: т.е. человек типа и мужчина и женщина . А если сделать как Вы решили, то, скорее всего, контролировть это будет более сложно, поскольку нужно просматривать таблицы мужчины и женщины. Но в Вашем варианте зато не будет Нулл и вообще проще структура. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 15:14 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenov wrote: > 2. Можно сделать 3 таблицы: люди, мужчины, женщины. У таблиц "люди" и > "мужчины" будет связь один к одному; и у таблиц "люди" и "женщины" будет > связь один к одному. Это не связь "один к одному", это связь "один к ноль-или-одному". (1:0..1). А это кардинально влияет на их применимость. Связи "один к одному" действительно очень редко применяются в БД. Я бы сказал, что это в 90% -- ошибка проектирования БД. > > Вопрос: какое решение из двух более правильное? И что когда применяется? 2-ое. Но 1-ое может также применяться, если наследников класса немного, как в данном случае (2). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 15:47 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, В примере 2 таблицы, а если таких таблиц скажем 100+, и полей в таблице будет 1000+ из которых 95% пустые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 15:56 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
vadiminfoчтобы чел не оказался и мужчиной и женщиноймужчинам только четные ID генерировать, а женщинам - только нечетные всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 16:15 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Yura PeregonIvan Durak, В примере 2 таблицы, а если таких таблиц скажем 100+, и полей в таблице будет 1000+ из которых 95% пустые? Если от абстракции спустится к конкретике, то в примере мужчины и женщины, к ним других полов трудно много придумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 16:44 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Паганельvadiminfoчтобы чел не оказался и мужчиной и женщиноймужчинам только четные ID генерировать, а женщинам - только нечетные всё Этот подход тоже имеет издержки типа: Это не ограничение целостности, а ограничения на ввод определенной программой суррогатного ключа. Т.е. в общем случае теперь надо проверять, что у мужчин не оказались нечетные, у женщин четные какой бы прогой данные не вводились, и той, что не знает ничего о правиле генерации. Тем более что суррогатный ключ изначально не предполагает каких-то правил связанных с предметной областью (мужчина четнное значение, женщина - нечетное ). Главное чтобы он был уникальным. В общем как бы ОЦ все равно желательна. Это не достаточно "семантично", поскольку не декларативно: если декларативеное ОЦ в МД видно, то про четеность и не четность нужно приложить больше усилий чтобы догадаться, тому кто ниче не знает об этом. Кроме того, этот прием может использоваться для других целей, и может возникнуть конфликт. Например, его рекомендуют для некоторых видов репликаций. В частности, я использую для мультимастер репликации в Оракле. Если потом окажется что нужна третья таблица, четвертая, то понадобится все пересчитывать по другому модулю. В общем случае суррогат может не генериться прогой, а использоваться какой-нибудь встроенный генератор, который генерит не числа. А мы же не можем быть уверены на начальном этапе в том, что этого потом не произойдет? Для тех для кого код (генерация) не желателен там где можно решить структурно и декларативно, скорей всего, это может казаться излишними программными ухищрениями, компенсирующими не достаточно удачное проектирование БД. Т.е. проектировщик, скорей всего, все равно остается перед выбором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 23:08 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Паганель, в догонку: риск изменеия сурогата: Допустим юзер ошибся наисал Ж вместо М? А потом исправил? Сурогат поменлся? Возможно, это в общем случае крайне не желательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2010, 23:20 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Паганельlavrenov1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нулловНе только Еще получаем необходимость проверок типа Код: plaintext нужно смотреть глубже. У мужчин тоже есть такое заключение, только врач немного по другому называется. Исторически сложилось, что мужским здоровьем в этом вопросе занимается уролог, женским - гинеколог. А вот уже само заключение, конечно, отличается. Нет смысла делать 2 разных поля и, тем более, 2 или 3 таблицы. Т.е. набор свойств, по большому счету, практически одинаков. Разница только в названиях. Вариант №1. + А если детально проанализируете свойства, то пустых полей будет не так уж и много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2010, 00:04 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
т.е. при проектирование смотрите не на названия, а на суть, содержание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2010, 00:06 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
iscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание. Извиняюсь за метафизический оффтоп: Мне сразу представилась база данных Бога. Таблица всех людей: ID, Пол, Суть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2010, 11:38 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Ivan Durakiscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание. Извиняюсь за метафизический оффтоп: Мне сразу представилась база данных Бога. Таблица всех людей: ID, Пол, Суть. Размер члена и размер клитора следует хранить в одном столбце. У них суть одна! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2010, 14:49 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenov, Жизнь показывает, что через со временем политические ветры могут подуть в другую сторону, и надо будет геев, лесбиянок и трасвеститов учитывать здесь же как отдельные сущности. Поэтому, ИМХО, 2-й вариант лучше: - Проще сопровождать. Не надо писать и постоянно переписывать многоэтажные констрейнты, не позоляющие для М задать свойства Ж и наоборот. - Как работать потом с этой кучей столбцов ? Кто из них для М, кто для Ж, а кто общий признак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2010, 19:08 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Почему нельзя сделать так: Таблица A IdPeople, FIO, idPol 1 Семён Семёныч 1 Таблица Б IdPol, DescriptionPol 1 | Муж 2 | Жен Я бы сделал так, собственно всегда так и делал. Если есть мнения против, хотелось бы услышать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2010, 16:28 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenovПроектирование БД. Хотелось бы на моем простом примере разобраться с типичной ситуацией, которая периодически возникает при проектировании БД. Фактически я не до конца понимаю, когда, в каких случаях на практике применяют связь один-к-одному. Существует три основных стратегии реализации "наследования", хорошо описанных, например, Фаулером в Patterns of Enterprise Application Architecture . 1. Single Table Inheritance - все в одной таблице с полем-типом (descriminator field) 2. Class Table Inheritance - на основе связи 1-к-1 3. Concrete Table Inheritance - без связей с таблицей-предком, все поля предков "дублируются" в таблице потомков. При этом, для получения записей всей иерархии как "корневых" типов строится view c union all: Код: plaintext 1. 2. 3. 4. Каждая из этих стратегий наследования имеет право на существование. Выбор делается для каждой конкретной ситуации. При этом этот выбор делает не "раз и навсегда". В ходе проектирования обычно выбирается стратегия Class Table Inheritance на основе связи 1-к-1, а в ходе эксплуатации/развертывании часто возникает потребность заменить Class Table Inheritance [1] на Concrete Table Inheritance [2]. В совсем простых случаях, обычно выбирают стратегию Single Table Inheritance [1] Главное что необходимо понять - проектирование БД не делается раз и навсегда. Это циклический процесс как и любая другая стадия в жизненном цикле ПО. И хотите вы этого или нет, в большинстве случаев вам придется заниматься рефакторингом структуры БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2010, 17:23 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36800262&tid=1542484]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
164ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 448ms |

| 0 / 0 |
