|
|
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Роман Дынник, люблю начитанных людей - умеют грамотно лить воду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2010, 02:37 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Ivan Durakiscrafmт.е. при проектирование смотрите не на названия, а на суть, содержание. Таблица всех людей: ID, Пол, Суть. Помню, лет 10 назад доводилось проектировать БД медицинского назначения. Проектировалось тщательно, с изучением предметной области, с тщательными опросами будущих ключевых пользователей. Как раз когда обсуждали структуру данных пациента, один умудренный сединами профессор строго указал - выбор пола должен быть не из двух, а из четырех вариантов - "М", "Ж", "Другое", "Неизвестно". В ответ на мое недоумение последовала фраза - "знаешь, на моем веку всякое повидать доводилось..." :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2010, 13:39 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
lavrenovПроектирование БД. Хотелось бы на моем простом примере разобраться с типичной ситуацией, которая периодически возникает при проектировании БД. Фактически я не до конца понимаю, когда, в каких случаях на практике применяют связь один-к-одному. Вот, например, есть такой пример "наследования". Очень похожая задача сейчас стоит по работе: Есть женщины, у них есть столбцы, которые могут иметь отношение только к женщине. Есть мужчины, у них есть столбцы, которые могут быть только у мужчин. А есть такие столбцы, которые могут быть и у мужчин и у женщин. Есть 2 решения: 1. Можно всех людей запихнуть в одну таблицу. В результате мы получаем в этой таблице много нуллов. Это немного смущает. Возможно, это не совсем правильное решение. 2. Можно сделать 3 таблицы: люди, мужчины, женщины. У таблиц "люди" и "мужчины" будет связь один к одному; и у таблиц "люди" и "женщины" будет связь один к одному. Вопрос: какое решение из двух более правильное? И что когда применяется? P.S. Связь один к одному собираюсь делать так: первичный ключ "мужиков" он же является внешним ключом на "людей". Первичный ключ людей - автоинкремент. Все верно? Спасибо! На мой взгляд, Вы смешиваете разные проблемы: "реализация связей" и "реализация наследования". Связи один-к-одному нужны когда вы не уверены не трансформируются ли они со временем в связи один-ко-многим (и это как раз Ваш случай - об этом ниже). Более того, Дейт рекомендует создавать для всех связей отдельные "таблицы", по многим причинам, а не только по той, что связь может стать многие-ко-многим. Беда в том, что это, формально, невозможно сделать в РМД. Теперь вернемся к Вашему примеру. Представьте себе, что одни свойства мужчин будут характерины только для одной группы мужчин, а другие - только для другой. И Вы опять "попадаете" на ту же проблему, но уже на работающей системе! Полезно посмотреть как подобные проблемы решаются в предметных областях, где они более выпуклы, так сказать. Например, для материалов (конечно, яблоки отличаются от селедки, а молоко от яблок и т.д. и т.п.):) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2010, 19:54 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
MaineCoon Помню, лет 10 назад доводилось проектировать БД медицинского назначения. Проектировалось тщательно, с изучением предметной области, с тщательными опросами будущих ключевых пользователей. Как раз когда обсуждали структуру данных пациента, один умудренный сединами профессор строго указал - выбор пола должен быть не из двух, а из четырех вариантов - "М", "Ж", "Другое", "Неизвестно". В ответ на мое недоумение последовала фраза - "знаешь, на моем веку всякое повидать доводилось..." :) Шутки шутками, но на самом деле возможных вариантов еще больше . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2010, 00:53 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 13:05 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
sergei64_89И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина. Хороший вопрос. Но он относится и к первому варианту тоже: как вводить значения "правильных" характеристик для конкретного человека? К сожалению, на уровне СУБД решения нет, только на уровне приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 13:44 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятинаsergei64_89И все же остается вопрос как вставлять данные в эти таблицы по второму варианту.люди связаны с таблицами мужчины и женщины связью один к одному,но один человек не может быть одновременно и тем и другим,соответственно связь один к нулю или к одному.здесь получается что каждый человек и мужчина и женщина. Хороший вопрос. Но он относится и к первому варианту тоже: как вводить значения "правильных" характеристик для конкретного человека? К сожалению, на уровне СУБД решения нет, только на уровне приложения.Я вот не понял вопроса sergei64_89... Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения". Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 13:51 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg Я вот не понял вопроса sergei64_89... Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения". Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн. Какой констрейн? Проблема в слове "одновременно". Мы сейчас далеко зайдем. Так как очевидно, что "не одновременно" человек может быть мужчиной и женщиной. Впрочем, одновременно тоже может:) На первый взгляд необходима какая-то специфическая характеристика в "головной" таблице, значение которой будет "направлять" нас правильным образом. Но ведь значение этой характеристики тоже меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 14:05 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятинаalexeyvg Я вот не понял вопроса sergei64_89... Конечно, для вставки данных нужно сделать INSERT, поэтому правильный ответ - "вставка данных возможна только на уровне приложения". Но, конечно, чтобы не получались ситуации "человек одновременно и мужчина и женщина", нужно сделать соответствующий констрейн. Какой констрейн? Проблема в слове "одновременно". Мы сейчас далеко зайдем. Так как очевидно, что "не одновременно" человек может быть мужчиной и женщиной. Впрочем, одновременно тоже может:) На первый взгляд необходима какая-то специфическая характеристика в "головной" таблице, значение которой будет "направлять" нас правильным образом. Но ведь значение этой характеристики тоже меняется.Обычный констрейн, не позволяющий создать для записи в головной таблице записи сразу в двух таблицах "ЭМ" и "ЖО" :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 14:16 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
К примеру.люди(ид,фио),студенты(ид,номер зачетки),преподаватели(ид,должность).при вставки новой записи в люди потребуется наличие записей и в студентах и преподавателях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 14:26 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Это ситуация описывает супертип подтип.но вот как реализовать при связи один к нулю или к одному я так и не понял.если кто знает,то поделитесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 14:30 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
sergei64_89Это ситуация описывает супертип подтип.но вот как реализовать при связи один к нулю или к одному я так и не понял.если кто знает,то поделитесь 3 таблицы: люди(ид, тип, фио) студенты(ид, тип, номер зачетки) преподаватели(ид, тип, должность) В каждой таблице 2 ключа: ид (ПК) ид, тип (АК) Таблицы студенты, преподаватели ссылаются (ФК) на люди В таблицах студенты, преподаватели делается дополнительно чек-констрейн на поле тип ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 15:00 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg Обычный констрейн, не позволяющий создать для записи в головной таблице записи сразу в двух таблицах "ЭМ" и "ЖО" :-) Не годится. Что же Вы игнорируете объяснения?:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 15:33 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
sergei64_89К примеру.люди(ид,фио),студенты(ид,номер зачетки),преподаватели(ид,должность).при вставки новой записи в люди потребуется наличие записей и в студентах и преподавателях. Почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 15:38 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg 3 таблицы: люди(ид, тип, фио) студенты(ид, тип, номер зачетки) преподаватели(ид, тип, должность) В каждой таблице 2 ключа: ид (ПК) ид, тип (АК) Таблицы студенты, преподаватели ссылаются (ФК) на люди В таблицах студенты, преподаватели делается дополнительно чек-констрейн на поле тип Не красиво ид, тип (АК) в первой таблице. Станет студент преподавателем:)... А тип в двух других таблицах, наверное, одинаковый для всех записей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 15:44 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятина, предложите свою реализацию,подскажите что есть АК ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 16:08 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятинаalexeyvg 3 таблицы: люди(ид, тип, фио) студенты(ид, тип, номер зачетки) преподаватели(ид, тип, должность) Не красиво ид, тип (АК) в первой таблице. Станет студент преподавателем:)... А тип в двух других таблицах, наверное, одинаковый для всех записей?Этот способ позволяет надёжно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-) Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид". В двух других таблицах тип одинаковый для всех записей, и для контроля этого даже предусмотрены чек-констрейны, как я ранее написал. По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для . Решение "К сожалению, на уровне СУБД решения нет, только на уровне приложения." считаю неправильным - если есть возможность простыми встроенными средствами СУБД обнспечить целостность, её нужно использовать. Знаем мы это "на уровне приложения" :-) БредятинаНе годится. Что же Вы игнорируете объяснения?:)Игнорирую, потому что вы не объясняете, а только говорите, что заете, как в таких случаях надо делать :-) Буду благодарен за альтернативные варианты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 20:51 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
sergei64_89подскажите что есть АКАК - это альтернативный ключ. В конкретных реализациях СУБД это может быть уникальный констрейн или уникальный индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 20:52 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg Этот способ позволяет надежно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-) Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид". Не позволяет. Вообще не позволяет. Но Вы продолжаете игнорировать замечания, или отделываетесь шутками:) Тоже вариант, конечно, Жаль, если единственный:) alexeyvg В двух других таблицах тип одинаковый для всех записей, и для контроля этого даже предусмотрены чек-констрейны, как я ранее написал. Это нонсенс. Даже ради "встроенных средств". Поддерживать одно значение атрибута для всех записей. alexeyvg По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для . А здесь не проходит. Человек может быть и студентом, и преподавателем. alexeyvg Решение "К сожалению, на уровне СУБД решения нет, только на уровне приложения." считаю неправильным - если есть возможность простыми встроенными средствами СУБД обнспечить целостность, её нужно использовать. Конечно. Если есть возможность. alexeyvg Игнорирую, потому что вы не объясняете, а только говорите, что заете, как в таких случаях надо делать :-) Неправда. Я объяснил почему так делать нельзя. И не говорил что знаю, как "в таких случаях надо делать". Я и не могу этого сказать, так как постановки задачи нет. Чтобы была понятна перспектива, нюансы и т.д. Абсолютно теоретическая постановка. Так что можно размышлять, фантазировать:) А Вы сразу констрэйны какие-то. [quot alexeyvg] Буду благодарен за альтернативные варианты. Я бы почти наверняка хранил бы все в одном объекте. Ограничений на количество характеристик объекта ("колонок" в "таблице") никаких нет в нормальной СУБД. Сгруппировать характеристики просто (это даже сам пользователь может сделать). Нет проблем для той ограниченной постановки, которая прозвучала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 22:12 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятинаalexeyvg Этот способ позволяет надежно, встроенными средствами любой СУБД решить поставленную задачу. Станет студент преподавателем, будет учить, как правильно строить модели данных :-) Поле тип не выходит за рамки этих двух таблиц (разве что фильтр сделать), все ссылки будут только на поле "ид". Не позволяет. Вообще не позволяет. Но Вы продолжаете игнорировать замечания, или отделываетесь шутками:) Тоже вариант, конечно, Жаль, если единственный:)"Не позволяет." и даже "Вообще не позволяет." - это не аргумент. БредятинаalexeyvgВ двух других таблицах тип одинаковый для всех записей, и для контроля этого даже предусмотрены чек-констрейны, как я ранее написал. Это нонсенс. Даже ради "встроенных средств". Поддерживать одно значение атрибута для всех записей."Нонсенс" - тоже не аргумент. Ради поддержки целостности наиболее экономичным, простым и надёжным способом я пойду даже на это :-) Ваше альтернативное решение, как я понял, это забить на целостность ради отсутствия неких абстрактных "нонсенсов"? Бредятинаalexeyvg По моему, типовая схема, я её лет 10-15 использую - с помощью всего-лишь АК и ФК обеспечить целостность данных для . А здесь не проходит. Человек может быть и студентом, и преподавателем.1. Если исходить из постановки задачи ТС, то человек не может быть и студентом, и преподавателем. 2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя. В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы. И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем. Бредятинаalexeyvg Буду благодарен за альтернативные варианты. Я бы почти наверняка хранил бы все в одном объекте. Ограничений на количество характеристик объекта ("колонок" в "таблице") никаких нет в нормальной СУБД. Сгруппировать характеристики просто (это даже сам пользователь может сделать). Нет проблем для той ограниченной постановки, которая прозвучала.Я бы тоже почти наверняка так сделал для данной задачи (хотя нужны детали постановки). Но часто делал и так, как описывал. Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе. Тимичный пример применения - всякие документо-ориентированные системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 22:33 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg "Не позволяет." и даже "Вообще не позволяет." - это не аргумент. Я же объяснил почему не позволяет. А Вы проигнорировали. Причем уже в третий раз:) alexeyvg "Нонсенс" - тоже не аргумент. Ради поддержки целостности наиболее экономичным, простым и надёжным способом я пойду даже на это :-) Ваше альтернативное решение, как я понял, это забить на целостность ради отсутствия неких абстрактных "нонсенсов"? Какое "мое решение"? Ваше решение никуда не годится. Оно просто неработоспособно. Далее Вы его будете уточнять. alexeyvg 1. Если исходить из постановки задачи ТС, то человек не может быть и студентом, и преподавателем. Неправда, нет этого в постановке, и про мужчин и женщин не забывайте, и про разные классы мужчин и женщин тоже не забывайте:) alexeyvg 2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя. В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы. И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем. Ага. Когда я Вам это сообщил, Вы проигнорировали. И что же, Вы серьезно считаете эту логику, о которой написали, не элементом приложения? alexeyvg Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе. Ну вот, видите, Вы стали говорить "если". А раньше ссылались на постановку автора - в ней же не было "50 непересекающихся":) А почему "не пойдет на пользу системе"? Что с ней случится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 23:03 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg, Спасибо за ответ.не обрашайте внимание на бредятина.человек тролит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 23:04 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
sergei64_89alexeyvg, Спасибо за ответ.не обрашайте внимание на бредятина.человек тролит. Поддерживаю:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 23:21 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
Бредятинаalexeyvg 2. Если расширить постановку задачи, и человек может быть и студентом, и преподавателем, то это значит (расшифровываю), что человек может иметь объединённый набор атрибутов студента и преподавателя. В этом случае нужно добавить значение типа "студент_преподаватель" и разрешить добавлять такие записи в обе дочерние таблицы. И заодно завести тип "никто", каковым отмечать людей, не являющихся ни студентом, не преподавателем. Ага. Когда я Вам это сообщил, Вы проигнорировали. И что же, Вы серьезно считаете эту логику, о которой написали, не элементом приложения?Приложение - это код на клиенте (в т.ч. на сервере приложения). А я говорю про необходимость по возможности реализовать целостность на уровне ограничений модели данных. Вот в данном случае эта возможность есть, я её описал. "разрешить добавлять такие записи " - это я же говорил не про код в приложении. Бредятинаalexeyvg Если у студентов и преподавателей 3 общих атрибута и по 50 непересекающихся, то 100 полей стиля "здесь читаем а здесь рыбу заворачивали" не пойдёт на пользу системе. Ну вот, видите, Вы стали говорить "если". А раньше ссылались на постановку автора - в ней же не было "50 непересекающихся":)Ну, видите-ли, тут разные вещи - как я сделал-бы сам, и ответ на вопрос ТС. На вопрос ТС, как лучьше реализовать указанное им решение №2, я привёл вышеописанный вариант. По поводу сравнения вариантов №1 и №2 я вообще не высказывался - не имею достаточно данных. А как я сделал-бы сам - это конечно зависит от условий задачи - я делал по разному... БредятинаА почему "не пойдет на пользу системе"? Что с ней случится?Потому что при таких схемах через несколько лет эксплуатации и несколько поколений меняющих систему программистов данные неуловимо изменяться :-) Будут совершенно фантастические комбинации заполнения полей. Констрейны это всё будут хоть немного сдерживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2010, 23:34 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
alexeyvg Приложение - это код на клиенте (в т.ч. на сервере приложения). А я говорю про необходимость по возможности реализовать целостность на уровне ограничений модели данных. Вот в данном случае эта возможность есть, я её описал. "разрешить добавлять такие записи " - это я же говорил не про код в приложении. [/quot] Я-то считаю, что на клиенте недолжно быть никаких кодов:) А то, что Вы программируете, так как это не запрограммировали разработчики СУБД, является частью приложения (или многих приложений, что не меняет сути дела, когда на клиенте нет кодов). То есть, мы просто по-разному понимаем некие термины. Так что я с Вами согласен, конечно, по этому аспекту:) alexeyvg Ну, видите-ли, тут разные вещи - как я сделал-бы сам, и ответ на вопрос ТС. На вопрос ТС, как лучше реализовать указанное им решение №2, я привёл вышеописанный вариант. По поводу сравнения вариантов №1 и №2 я вообще не высказывался - не имею достаточно данных. А как я сделал-бы сам - это конечно зависит от условий задачи - я делал по разному... Это понятно. Непонятным осталось обоснование Типов в "дочерних" таблицах. Разве Вы не можете написать код (на стороне сервера), который обеспечит то, что Вам нужно без этих атрибутов? alexeyvg Потому что при таких схемах через несколько лет эксплуатации и несколько поколений меняющих систему программистов данные неуловимо изменяться :-) Будут совершенно фантастические комбинации заполнения полей. Констрейны это всё будут хоть немного сдерживать. Данные, конечно, изменятся:) Но при чем здесь вообще программисты? Пользователи будут группировать характеристики объектов так, как им удобнее, В ЛЮБОМ СЛУЧАЕ. Программисты, к счастью, не могут им в этом мешать:) А про констрэйны см. в предыдущем абзаце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2010, 22:56 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
я лох ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 00:39 |
|
||
|
Когда нужна связь один-к-одному?
|
|||
|---|---|---|---|
|
#18+
бредятиная лох Вы забыли Бредятина с большой буквы написать:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2010, 15:27 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1542484]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
190ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
89ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 567ms |

| 0 / 0 |
