powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Когда нужна связь один-к-одному?
52 сообщений из 52, показаны все 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
Когда нужна связь один-к-одному?
    #36862271
MaineCoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan Durakiscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание.
Таблица всех людей:
ID, Пол, Суть.

Помню, лет 10 назад доводилось проектировать БД медицинского назначения. Проектировалось тщательно, с изучением предметной области, с тщательными опросами будущих ключевых пользователей.
Как раз когда обсуждали структуру данных пациента, один умудренный сединами профессор строго указал - выбор пола должен быть не из двух, а из четырех вариантов - "М", "Ж", "Другое", "Неизвестно". В ответ на мое недоумение последовала фраза - "знаешь, на моем веку всякое повидать доводилось..." :)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36865664
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lavrenovПроектирование БД.

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

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


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

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


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

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

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

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


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

Спасибо!

На мой взгляд, Вы смешиваете разные проблемы: "реализация связей" и "реализация наследования".
Связи один-к-одному нужны когда вы не уверены не трансформируются ли они со временем в связи один-ко-многим (и это как раз Ваш случай - об этом ниже). Более того, Дейт рекомендует создавать для всех связей отдельные "таблицы", по многим причинам, а не только по той, что связь может стать многие-ко-многим. Беда в том, что это, формально, невозможно сделать в РМД.

Теперь вернемся к Вашему примеру. Представьте себе, что одни свойства мужчин будут характерины только для одной группы мужчин, а другие - только для другой. И Вы опять "попадаете" на ту же проблему, но уже на работающей системе!

Полезно посмотреть как подобные проблемы решаются в предметных областях, где они более выпуклы, так сказать. Например, для материалов (конечно, яблоки отличаются от селедки, а молоко от яблок и т.д. и т.п.):)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36866459
Flying Dutchman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaineCoon
Помню, лет 10 назад доводилось проектировать БД медицинского назначения. Проектировалось тщательно, с изучением предметной области, с тщательными опросами будущих ключевых пользователей.
Как раз когда обсуждали структуру данных пациента, один умудренный сединами профессор строго указал - выбор пола должен быть не из двух, а из четырех вариантов - "М", "Ж", "Другое", "Неизвестно". В ответ на мое недоумение последовала фраза - "знаешь, на моем веку всякое повидать доводилось..." :)

Шутки шутками, но на самом деле возможных вариантов еще больше .
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902921
sergei64_89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902938
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergei64_89И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина.
Хороший вопрос. Но он относится и к первому варианту тоже: как вводить значения "правильных" характеристик для конкретного человека? К сожалению, на уровне СУБД решения нет, только на уровне приложения.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902942
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаsergei64_89И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина.
Хороший вопрос. Но он относится и к первому варианту тоже: как вводить значения "правильных" характеристик для конкретного человека? К сожалению, на уровне СУБД решения нет, только на уровне приложения.Я вот не понял вопроса sergei64_89...

Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения".

Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902948
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Я вот не понял вопроса sergei64_89...
Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения".
Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн.
Какой констрейн? Проблема в слове "одновременно". Мы сейчас далеко зайдем. Так как очевидно, что "не одновременно" человек может быть мужчиной и женщиной. Впрочем, одновременно тоже может:) На первый взгляд необходима какая-то специфическая характеристика в "головной" таблице, значение которой будет "направлять" нас правильным образом. Но ведь значение этой характеристики тоже меняется.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902952
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаalexeyvg
Я вот не понял вопроса sergei64_89...
Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения".
Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн.
Какой констрейн? Проблема в слове "одновременно". Мы сейчас далеко зайдем. Так как очевидно, что "не одновременно" человек может быть мужчиной и женщиной. Впрочем, одновременно тоже может:) На первый взгляд необходима какая-то специфическая характеристика в "головной" таблице, значение которой будет "направлять" нас правильным образом. Но ведь значение этой характеристики тоже меняется.Обычный констрейн, не позволяющий создать для записи в головной таблице записи сразу в двух таблицах "ЭМ" и "ЖО" :-)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902959
sergei64_89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К примеру.люди(ид,фио),студенты(ид,номер зачетки),преподаватели(ид,должность).при вставки новой записи в люди потребуется наличие записей и в студентах и преподавателях.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902963
sergei64_89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ситуация описывает супертип подтип.но вот как реализовать при связи один к нулю или к одному я так и не понял.если кто знает,то поделитесь
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36902987
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergei64_89Это ситуация описывает супертип подтип.но вот как реализовать при связи один к нулю или к одному я так и не понял.если кто знает,то поделитесь

3 таблицы:
люди(ид, тип, фио)
студенты(ид, тип, номер зачетки)
преподаватели(ид, тип, должность)

В каждой таблице 2 ключа:
ид (ПК)
ид, тип (АК)

Таблицы студенты, преподаватели ссылаются (ФК) на люди
В таблицах студенты, преподаватели делается дополнительно чек-констрейн на поле тип
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903018
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Обычный констрейн, не позволяющий создать для записи в головной таблице записи сразу в двух таблицах "ЭМ" и "ЖО" :-)
Не годится. Что же Вы игнорируете объяснения?:)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903024
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergei64_89К примеру.люди(ид,фио),студенты(ид,номер зачетки),преподаватели(ид,должность).при вставки новой записи в люди потребуется наличие записей и в студентах и преподавателях.
Почему?
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903029
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
3 таблицы:
люди(ид, тип, фио)
студенты(ид, тип, номер зачетки)
преподаватели(ид, тип, должность)

В каждой таблице 2 ключа:
ид (ПК)
ид, тип (АК)

Таблицы студенты, преподаватели ссылаются (ФК) на люди
В таблицах студенты, преподаватели делается дополнительно чек-констрейн на поле тип
Не красиво ид, тип (АК) в первой таблице. Станет студент преподавателем:)... А тип в двух других таблицах, наверное, одинаковый для всех записей?
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903055
sergei64_89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятина,
предложите свою реализацию,подскажите что есть АК
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903233
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаalexeyvg
3 таблицы:
люди(ид, тип, фио)
студенты(ид, тип, номер зачетки)
преподаватели(ид, тип, должность)

Не красиво ид, тип (АК) в первой таблице. Станет студент преподавателем:)... А тип в двух других таблицах, наверное, одинаковый для всех записей?Этот способ позволяет надёжно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-)

Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид".

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

По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для .
Решение "К сожалению, на уровне СУБД решения нет, только на уровне приложения." считаю неправильным - если есть возможность простыми встроенными средствами СУБД обнспечить целостность, её нужно использовать. Знаем мы это "на уровне приложения" :-)

БредятинаНе годится. Что же Вы игнорируете объяснения?:)Игнорирую, потому что вы не объясняете, а только говорите, что заете, как в таких случаях надо делать :-)

Буду благодарен за альтернативные варианты.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903235
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergei64_89подскажите что есть АКАК - это альтернативный ключ.

В конкретных реализациях СУБД это может быть уникальный констрейн или уникальный индекс.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903295
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Этот способ позволяет надежно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-)
Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид".

Не позволяет. Вообще не позволяет. Но Вы продолжаете игнорировать замечания, или отделываетесь шутками:) Тоже вариант, конечно, Жаль, если единственный:)
alexeyvg
В двух других таблицах тип одинаковый для всех записей, и для контроля этого даже предусмотрены чек-констрейны, как я ранее написал.

Это нонсенс. Даже ради "встроенных средств". Поддерживать одно значение атрибута для всех записей.
alexeyvg
По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для .

А здесь не проходит. Человек может быть и студентом, и преподавателем.
alexeyvg
Решение "К сожалению, на уровне СУБД решения нет, только на уровне приложения." считаю неправильным - если есть возможность простыми встроенными средствами СУБД обнспечить целостность, её нужно использовать.

Конечно. Если есть возможность.
alexeyvg
Игнорирую, потому что вы не объясняете, а только говорите, что заете, как в таких случаях надо делать :-)
Неправда. Я объяснил почему так делать нельзя. И не говорил что знаю, как "в таких случаях надо делать". Я и не могу этого сказать, так как постановки задачи нет. Чтобы была понятна перспектива, нюансы и т.д. Абсолютно теоретическая постановка. Так что можно размышлять, фантазировать:) А Вы сразу констрэйны какие-то.
[quot alexeyvg]
Буду благодарен за альтернативные варианты.
Я бы почти наверняка хранил бы все в одном объекте. Ограничений на количество характеристик объекта ("колонок" в "таблице") никаких нет в нормальной СУБД. Сгруппировать характеристики просто (это даже сам пользователь может сделать). Нет проблем для той ограниченной постановки, которая прозвучала.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903309
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаalexeyvg
Этот способ позволяет надежно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-)
Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид".

Не позволяет. Вообще не позволяет. Но Вы продолжаете игнорировать замечания, или отделываетесь шутками:) Тоже вариант, конечно, Жаль, если единственный:)"Не позволяет." и даже "Вообще не позволяет." - это не аргумент.

БредятинаalexeyvgВ двух других таблицах тип одинаковый для всех записей, и для контроля этого даже предусмотрены чек-констрейны, как я ранее написал.

Это нонсенс. Даже ради "встроенных средств". Поддерживать одно значение атрибута для всех записей."Нонсенс" - тоже не аргумент.

Ради поддержки целостности наиболее экономичным, простым и надёжным способом я пойду даже на это :-)

Ваше альтернативное решение, как я понял, это забить на целостность ради отсутствия неких абстрактных "нонсенсов"?

Бредятинаalexeyvg
По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для .

А здесь не проходит. Человек может быть и студентом, и преподавателем.1. Если исходить из постановки задачи ТС, то человек не может быть и студентом, и преподавателем.

2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя.
В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы.
И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем.

Бредятинаalexeyvg
Буду благодарен за альтернативные варианты.
Я бы почти наверняка хранил бы все в одном объекте. Ограничений на количество характеристик объекта ("колонок" в "таблице") никаких нет в нормальной СУБД. Сгруппировать характеристики просто (это даже сам пользователь может сделать). Нет проблем для той ограниченной постановки, которая прозвучала.Я бы тоже почти наверняка так сделал для данной задачи (хотя нужны детали постановки).

Но часто делал и так, как описывал.

Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе.

Тимичный пример применения - всякие документо-ориентированные системы.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903330
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
"Не позволяет." и даже "Вообще не позволяет." - это не аргумент.

Я же объяснил почему не позволяет. А Вы проигнорировали. Причем уже в третий раз:)
alexeyvg
"Нонсенс" - тоже не аргумент. Ради поддержки целостности наиболее экономичным, простым и надёжным способом я пойду даже на это :-)
Ваше альтернативное решение, как я понял, это забить на целостность ради отсутствия неких абстрактных "нонсенсов"?

Какое "мое решение"? Ваше решение никуда не годится. Оно просто неработоспособно. Далее Вы его будете уточнять.
alexeyvg
1. Если исходить из постановки задачи ТС, то человек не может быть и студентом, и преподавателем.

Неправда, нет этого в постановке, и про мужчин и женщин не забывайте, и про разные классы мужчин и женщин тоже не забывайте:)
alexeyvg
2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя.
В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы.
И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем.

Ага. Когда я Вам это сообщил, Вы проигнорировали. И что же, Вы серьезно считаете эту логику, о которой написали, не элементом приложения?
alexeyvg
Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе.

Ну вот, видите, Вы стали говорить "если". А раньше ссылались на постановку автора - в ней же не было "50 непересекающихся":) А почему "не пойдет на пользу системе"? Что с ней случится?
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903333
sergei64_89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Спасибо за ответ.не обрашайте внимание на бредятина.человек тролит.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903340
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergei64_89alexeyvg,
Спасибо за ответ.не обрашайте внимание на бредятина.человек тролит.
Поддерживаю:)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36903355
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинаalexeyvg
2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя.
В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы.
И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем.

Ага. Когда я Вам это сообщил, Вы проигнорировали. И что же, Вы серьезно считаете эту логику, о которой написали, не элементом приложения?Приложение - это код на клиенте (в т.ч. на сервере приложения).

А я говорю про необходимость по возможности реализовать целостность на уровне ограничений модели данных. Вот в данном случае эта возможность есть, я её описал.

"разрешить добавлять такие записи " - это я же говорил не про код в приложении.

Бредятинаalexeyvg
Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе.

Ну вот, видите, Вы стали говорить "если". А раньше ссылались на постановку автора - в ней же не было "50 непересекающихся":)Ну, видите-ли, тут разные вещи - как я сделал-бы сам, и ответ на вопрос ТС.

На вопрос ТС, как лучьше реализовать указанное им решение №2, я привёл вышеописанный вариант. По поводу сравнения вариантов №1 и №2 я вообще не высказывался - не имею достаточно данных.

А как я сделал-бы сам - это конечно зависит от условий задачи - я делал по разному...

БредятинаА почему "не пойдет на пользу системе"? Что с ней случится?Потому что при таких схемах через несколько лет эксплуатации и несколько поколений меняющих систему программистов данные неуловимо изменяться :-) Будут совершенно фантастические комбинации заполнения полей.

Констрейны это всё будут хоть немного сдерживать.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36904162
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

Приложение - это код на клиенте (в т.ч. на сервере приложения).
А я говорю про необходимость по возможности реализовать целостность на уровне ограничений модели данных. Вот в данном случае эта возможность есть, я её описал.
"разрешить добавлять такие записи " - это я же говорил не про код в приложении.
[/quot]
Я-то считаю, что на клиенте недолжно быть никаких кодов:) А то, что Вы программируете, так как это не запрограммировали разработчики СУБД, является частью приложения (или многих приложений, что не меняет сути дела, когда на клиенте нет кодов). То есть, мы просто по-разному понимаем некие термины. Так что я с Вами согласен, конечно, по этому аспекту:)
alexeyvg
Ну, видите-ли, тут разные вещи - как я сделал-бы сам, и ответ на вопрос ТС.
На вопрос ТС, как лучше реализовать указанное им решение №2, я привёл вышеописанный вариант. По поводу сравнения вариантов №1 и №2 я вообще не высказывался - не имею достаточно данных.
А как я сделал-бы сам - это конечно зависит от условий задачи - я делал по разному...

Это понятно. Непонятным осталось обоснование Типов в "дочерних" таблицах. Разве Вы не можете написать код (на стороне сервера), который обеспечит то, что Вам нужно без этих атрибутов?
alexeyvg
Потому что при таких схемах через несколько лет эксплуатации и несколько поколений меняющих систему программистов данные неуловимо изменяться :-) Будут совершенно фантастические комбинации заполнения полей.
Констрейны это всё будут хоть немного сдерживать.
Данные, конечно, изменятся:) Но при чем здесь вообще программисты? Пользователи будут группировать характеристики объектов так, как им удобнее, В ЛЮБОМ СЛУЧАЕ. Программисты, к счастью, не могут им в этом мешать:) А про констрэйны см. в предыдущем абзаце.
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36904210
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я лох
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36905402
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бредятиная лох
Вы забыли Бредятина с большой буквы написать:)
...
Рейтинг: 0 / 0
Когда нужна связь один-к-одному?
    #36905512
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятинабредятиная лох
Вы забыли Бредятина с большой буквы написать:)Ну так он-же лох :-)
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Когда нужна связь один-к-одному?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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