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

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

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


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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

Я бы сделал так, собственно всегда так и делал. Если есть мнения против, хотелось бы услышать.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #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
Когда нужна связь один-к-одному?
    #36854598
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынник,

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


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