Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Когда нужна связь один-к-одному? / 25 сообщений из 52, страница 1 из 3
19.08.2010, 13:46
    #36800090
lavrenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Проектирование БД.

Хотелось бы на моем простом примере разобраться с типичной ситуацией, которая периодически возникает при проектировании БД. Фактически я не до конца понимаю, когда, в каких случаях на практике применяют связь один-к-одному.

Вот, например, есть такой пример "наследования". Очень похожая задача сейчас стоит по работе:


Есть женщины, у них есть столбцы, которые могут иметь отношение только к женщине.
Есть мужчины, у них есть столбцы, которые могут быть только у мужчин.

А есть такие столбцы, которые могут быть и у мужчин и у женщин.


Есть 2 решения:

1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нуллов. Это немного смущает. Возможно, это не совсем правильное решение.

2. Можно сделать 3 таблицы: люди, мужчины, женщины. У таблиц "люди" и "мужчины" будет связь один к одному; и у таблиц "люди" и "женщины" будет связь один к одному.

Вопрос: какое решение из двух более правильное? И что когда применяется?


P.S. Связь один к одному собираюсь делать так: первичный ключ "мужиков" он же является внешним ключом на "людей". Первичный ключ людей - автоинкремент. Все верно?

Спасибо!
...
Рейтинг: 0 / 0
19.08.2010, 13:56
    #36800131
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
lavrenov1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нулловНе только
Еще получаем необходимость проверок типа
Код: plaintext
если [пол] == 'женский', то поле [заключение гинеколога] должно быть заполнено, иначе должно быть пустое
...
Рейтинг: 0 / 0
19.08.2010, 13:59
    #36800148
Ortogon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
1. Большое количество пустых полей в таблице вас сильно смущать не должно. Современные СУБД неплохо их обжимают.

2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает.
...
Рейтинг: 0 / 0
19.08.2010, 14:04
    #36800169
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
OrtogonХотя не совсем понял, зачем вам внешний ключдля того, чтобы обеспечить следующее:Ortogonзначение первичного ключа в ней всегда равно первичному ключу в таблице "люди"
...
Рейтинг: 0 / 0
19.08.2010, 14:11
    #36800196
Ortogon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
ПаганельOrtogonХотя не совсем понял, зачем вам внешний ключдля того, чтобы обеспечить следующее:Ortogonзначение первичного ключа в ней всегда равно первичному ключу в таблице "люди"
lavrenovP.S. Связь один к одному собираюсь делать так: первичный ключ "мужиков" он же является внешним ключом на "людей". Первичный ключ людей - автоинкремент. Все верно?
Тогда уж первичный ключ "людей" должен быть внешним на первичном в "мужиках". В таблице "люди" внешних ключей на "мужиков" не нужно.
...
Рейтинг: 0 / 0
19.08.2010, 14:14
    #36800206
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
А, вот Вы о чем
Видимо, автор направляет FK все-таки в нужную сторону, только словами это невнятно выразил
Бывает
...
Рейтинг: 0 / 0
19.08.2010, 14:29
    #36800262
Ortogon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
ПаганельА, вот Вы о чем
Видимо, автор направляет FK все-таки в нужную сторону, только словами это невнятно выразил
Бывает
Да, наверное. Я просто хотел отметить, что если связка один к одному, не стоит делать еще дополнительные поля со ссылкой на другие таблицы. Хотя это наверное очевидно...
...
Рейтинг: 0 / 0
19.08.2010, 14:31
    #36800268
lavrenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Ortogon
2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает.

Хорошо. Спасибо.
Но не до конца понимаю, зачем делать вьюхи для каждого из полов? Чтобы в эти вьюхи потом удобно было делать апдейты и инсерты?
...
Рейтинг: 0 / 0
19.08.2010, 14:31
    #36800269
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Лишние нуллы займет меньше места чем лишние PK у дочерних таблиц. Да и прозрачность работы и скорость будут выше. 1-й вариант таки лучше.
...
Рейтинг: 0 / 0
19.08.2010, 14:55
    #36800371
Ortogon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
lavrenovOrtogon
2. Тоже имеет право на жизнь. Хотя не совсем понял, зачем вам внешний ключ. Изначально генерится запись в таблице "люди", первичный ключ - автоинкремент. В зависимости от пола генерится запись в соответствующей таблице гендерных атрибутов, значение первичного ключа в ней всегда равно первичному ключу в таблице "люди". Вьюху делаете, которая в зависимости от пола либо с мужской, либо с женской таблицей работает.

Хорошо. Спасибо.
Но не до конца понимаю, зачем делать вьюхи для каждого из полов? Чтобы в эти вьюхи потом удобно было делать апдейты и инсерты?

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

Хотя я тоже склоняюсь к первому варианту. Дублирующие индексы у вас сожрут больше места, чем пустые поля. Разделение на несколько таблиц оправдано, ИМХО, когда вам нужно разграничить доступ к разным атрибутам, а СУБД или конкретная программа не поддерживает права на уровне поля.
...
Рейтинг: 0 / 0
19.08.2010, 15:14
    #36800478
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
lavrenov,
Тут проектировщик стоит перед выбором в плане оптимальности.
Например, Решение 2 выглядит более адекватно в логическом плане, поскольку если свойство отсутсвует, то луче чтобы его структурно не было возможности внести в принципе. Это своего рода ограничение целостности. Но таблиц больше.
Кроме того, из соображений упрощения поддержки ограничений целостности, возможно, наоборот, в таблице Люди сделать внешние на женщин и мужчин, поскольку в этом случае легче организовать ограничение на то, чтобы чел не оказался и мужчиной и женщиной( правда тада появится Нуллы, в этих колонках). Но, например, ограничением на значение можно добиться, чтобы не был не Нулл на обоих: т.е. человек типа и мужчина и женщина . А если сделать как Вы решили, то, скорее всего, контролировть это будет более сложно, поскольку нужно просматривать таблицы мужчины и женщины. Но в Вашем варианте зато не будет Нулл и вообще проще структура.
...
Рейтинг: 0 / 0
19.08.2010, 15:47
    #36800637
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
lavrenov wrote:

> 2. Можно сделать 3 таблицы: люди, мужчины, женщины. У таблиц "люди" и
> "мужчины" будет связь один к одному; и у таблиц "люди" и "женщины" будет
> связь один к одному.

Это не связь "один к одному", это связь "один к ноль-или-одному".
(1:0..1). А это кардинально влияет на их применимость.
Связи "один к одному" действительно очень редко применяются в БД.
Я бы сказал, что это в 90% -- ошибка проектирования БД.

>
> Вопрос: какое решение из двух более правильное? И что когда применяется?

2-ое. Но 1-ое может также применяться, если наследников класса немного,
как в данном случае (2).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
19.08.2010, 15:56
    #36800679
Yura Peregon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Ivan Durak,

В примере 2 таблицы, а если таких таблиц скажем 100+, и полей в таблице будет 1000+ из которых 95% пустые?
...
Рейтинг: 0 / 0
19.08.2010, 16:15
    #36800763
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
vadiminfoчтобы чел не оказался и мужчиной и женщиноймужчинам только четные ID генерировать, а женщинам - только нечетные
всё
...
Рейтинг: 0 / 0
19.08.2010, 16:44
    #36800839
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Yura PeregonIvan Durak,

В примере 2 таблицы, а если таких таблиц скажем 100+, и полей в таблице будет 1000+ из которых 95% пустые?
Если от абстракции спустится к конкретике, то в примере мужчины и женщины, к ним других полов трудно много придумать.
...
Рейтинг: 0 / 0
19.08.2010, 23:08
    #36801442
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Паганельvadiminfoчтобы чел не оказался и мужчиной и женщиноймужчинам только четные ID генерировать, а женщинам - только нечетные
всё
Этот подход тоже имеет издержки типа:

Это не ограничение целостности, а ограничения на ввод определенной программой суррогатного ключа. Т.е. в общем случае теперь надо проверять, что у мужчин не оказались нечетные, у женщин четные какой бы прогой данные не вводились, и той, что не знает ничего о правиле генерации. Тем более что суррогатный ключ изначально не предполагает каких-то правил связанных с предметной областью (мужчина четнное значение, женщина - нечетное ). Главное чтобы он был уникальным. В общем как бы ОЦ все равно желательна.

Это не достаточно "семантично", поскольку не декларативно: если декларативеное ОЦ в МД видно, то про четеность и не четность нужно приложить больше усилий чтобы догадаться, тому кто ниче не знает об этом.

Кроме того, этот прием может использоваться для других целей, и может возникнуть конфликт. Например, его рекомендуют для некоторых видов репликаций. В частности, я использую для мультимастер репликации в Оракле.

Если потом окажется что нужна третья таблица, четвертая, то понадобится все пересчитывать по другому модулю.

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

А мы же не можем быть уверены на начальном этапе в том, что этого потом не произойдет?


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


Т.е. проектировщик, скорей всего, все равно остается перед выбором.
...
Рейтинг: 0 / 0
19.08.2010, 23:20
    #36801448
vadiminfo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Паганель,

в догонку: риск изменеия сурогата: Допустим юзер ошибся наисал Ж вместо М? А потом исправил? Сурогат поменлся? Возможно, это в общем случае крайне не желательно.
...
Рейтинг: 0 / 0
20.08.2010, 00:04
    #36801482
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Паганельlavrenov1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нулловНе только
Еще получаем необходимость проверок типа
Код: plaintext
если [пол] == 'женский', то поле [заключение гинеколога] должно быть заполнено, иначе должно быть пустое

нужно смотреть глубже. У мужчин тоже есть такое заключение, только врач немного по другому называется. Исторически сложилось, что мужским здоровьем в этом вопросе занимается уролог, женским - гинеколог. А вот уже само заключение, конечно, отличается. Нет смысла делать 2 разных поля и, тем более, 2 или 3 таблицы. Т.е. набор свойств, по большому счету, практически одинаков. Разница только в названиях.
Вариант №1. + А если детально проанализируете свойства, то пустых полей будет не так уж и много.
...
Рейтинг: 0 / 0
20.08.2010, 00:06
    #36801485
iscrafm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
т.е. при проектирование смотрите не на названия, а на суть, содержание.
...
Рейтинг: 0 / 0
20.08.2010, 11:38
    #36802146
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
iscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание.
Извиняюсь за метафизический оффтоп:
Мне сразу представилась база данных Бога.
Таблица всех людей:
ID, Пол, Суть.
...
Рейтинг: 0 / 0
20.08.2010, 14:49
    #36802920
lavrenov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Ivan Durakiscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание.
Извиняюсь за метафизический оффтоп:
Мне сразу представилась база данных Бога.
Таблица всех людей:
ID, Пол, Суть.

Размер члена и размер клитора следует хранить в одном столбце. У них суть одна!
...
Рейтинг: 0 / 0
20.08.2010, 19:08
    #36803725
Хэнк
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
lavrenov,

Жизнь показывает, что через со временем политические ветры могут подуть в другую сторону, и надо будет геев, лесбиянок и трасвеститов учитывать здесь же как отдельные сущности. Поэтому, ИМХО, 2-й вариант лучше:
- Проще сопровождать. Не надо писать и постоянно переписывать многоэтажные констрейнты, не позоляющие для М задать свойства Ж и наоборот.
- Как работать потом с этой кучей столбцов ? Кто из них для М, кто для Ж, а кто общий признак?
...
Рейтинг: 0 / 0
06.09.2010, 16:28
    #36832211
Taekwonder
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Почему нельзя сделать так:
Таблица A
IdPeople, FIO, idPol
1 Семён Семёныч 1
Таблица Б
IdPol, DescriptionPol
1 | Муж
2 | Жен

Я бы сделал так, собственно всегда так и делал. Если есть мнения против, хотелось бы услышать.
...
Рейтинг: 0 / 0
06.09.2010, 17:23
    #36832455
Роман Дынник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
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.
select f1, f2 from t1
union all
select f1, f2 from t2
union all
select f1, f2 from t3

Каждая из этих стратегий наследования имеет право на существование.
Выбор делается для каждой конкретной ситуации.
При этом этот выбор делает не "раз и навсегда".
В ходе проектирования обычно выбирается стратегия Class Table Inheritance на основе связи 1-к-1, а в ходе эксплуатации/развертывании часто возникает потребность заменить Class Table Inheritance [1] на Concrete Table Inheritance [2].
В совсем простых случаях, обычно выбирают стратегию Single Table Inheritance [1]

Главное что необходимо понять - проектирование БД не делается раз и навсегда. Это циклический процесс как и любая другая стадия в жизненном цикле ПО. И хотите вы этого или нет, в большинстве случаев вам придется заниматься рефакторингом структуры БД.
...
Рейтинг: 0 / 0
20.09.2010, 02:37
    #36854598
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Когда нужна связь один-к-одному?
Роман Дынник,

люблю начитанных людей - умеют грамотно лить воду
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Когда нужна связь один-к-одному? / 25 сообщений из 52, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]