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

Есть таблица STONES, упрощенно, - ( id int PK, name varchar, status int).
В таблице хранятся данные по камнях. Поле status определяет является ли камень отдельным видом или разновидностью другого камня.

Один камень (вид) может иметь несколько разновидностей. Если камень - разновидность, природа распорядилась так, что он может относиться к нескольким видам.

Вопрос такой - как технически организовать (или реорганизовать) эту таблицу, чтоб обеспечить целостность.
Добавить еще одно поле и сделать его FK на id нельзя, не позволяют условия.

Я склоняюсь к варианту:
- Сделать еще одну таблицу вроде - MTF ( stone_id int, form_id int), видимо придется полюбому, но как быть в таком случае с уникальностью записей в ней?
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37642759
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица Камней (Камень)
Таблица КаменьЯвляетсяРазновидностью (Камень, РазновидностьюКакогоКамняЯвляется)
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37642769
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сфьщ Подскажите, как правильно спроектировать БД.Сразу скажу что правильно проектируется БД только для определенного задания. То есть КАМАЗ совершенно правильно спроектирован для перевозки грузов, но совершенно неправильно для поездок на работу и с работы.

сфьщ В таблице хранятся данные по камнях.Наверное все-таки не по камням (реальным объектам с массой и размерами) а по классификатору камней.
авторОдин камень (вид) может иметь несколько разновидностей. Если камень - разновидность, природа распорядилась так, что он может относиться к нескольким видам.То бишь в одной таблице вы храните общего предка вместе с потомками.

например

Каменюка
Каменюка обыкновенная
Каменюка необыкновенная
Каменюка красивая

сфьщ Вопрос такой - как технически организовать (или реорганизовать) эту таблицу, чтоб обеспечить целостность.Целостность чего вы обеспечиваете? Поясню - в какой момент база должна выдать ошибку чтобы не дать вставить/поменять/удалить данные. То бишь в случае с примером выше мы не можем удалить запись Каменюка если от нее есть потомки.
авторДобавить еще одно поле и сделать его FK на id нельзя, не позволяют условия.Почему? Это как раз классическое решение - хотя и не единственное. Убрать поле status, заменить его на parent_id и если оно null - значит это разновидность, а не отдельный вид.

сфьщ Я склоняюсь к варианту:
- Сделать еще одну таблицу вроде - MTF (stone_id int,form_id int)Опять же чего вы хотите добится.

Сколько уровней в вашей иерархии?
Каменюка
Каменюка обыкновенная
Каменюка обыкновенная с дырочкой

Есть ли предел (офицально утвержденный) для максимума иерархий?

Можете почитать про Деревья в SQL
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37642943
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257То бишь в одной таблице вы храните общего предка вместе с потомками.

например

Каменюка
Каменюка обыкновенная
Каменюка необыкновенная
Каменюка красивая

Да, пока так и есть.

SERG1257Почему? Это как раз классическое решение - хотя и не единственное. Убрать поле status, заменить его на parent_id и если оно null - значит это разновидность, а не отдельный вид.
Потому, что несколько , как вы пишете, "предков" может быть для одного "потомка".

например

Каменюка обыкновенная
Булыжник

могут быть предками для Каменюка рудная

Явно нужно еще таблицу одну, как я писал.


SERG1257 То бишь в случае с примером выше мы не можем удалить запись Каменюка если от нее есть потомки.
Если б существовал какой-нибудь идиоматический вариант, когда при удалении записи "Каменюка", все связанные с ней записи в таблице MTF удалялись, или при удалении записи "Каменюка рудная" все связанные с ней записи в MTF тоже удалялись, и при всем при этом записи в MTF были уникальны (как если бы был составной PK из stone_id,form_id) - я б был рад.
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37642967
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сфьщ Потому, что несколько , как вы пишете, "предков" может быть для одного "потомка".То бишь у вас нифига не дерево, а совсем даже граф. Тогда ваше решение
stones - узлы графа
MTF - дуги графа
Код: sql
1.
create table mtf (parent_id int references stones,child_id int references stones)


имеет место быть.
сфьщ Если б существовал какой-нибудь идиоматический вариант, когда при удалении записи "Каменюка", все связанные с ней записи в таблице MTF удалялись, или при удалении записи "Каменюка рудная" все связанные с ней записи в MTF тоже удалялись
Если вы пропишите on delete cascade на ограничение, то при удалении узла все ссылки на него и/или от него автоматически удалятся. Если логика не столь однозначна - пишите триггеры.
сфьщ и при всем при этом записи в MTF были уникальны (как если бы был составной PK из stone_id,form_id) - я б был рад. И что вам мешает объявить такой первичный ключ?
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643036
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257То бишь у вас нифига не дерево, а совсем даже граф. Тогда ваше решение
stones - узлы графа
MTF - дуги графа
Код: sql
1.
create table mtf (parent_id int references stones,child_id int references stones)


имеет место быть.

Проблема в том,что тогда нельзя прописать каскадное удаление для двух FK, только на один какой-нибудь, так как они привязаны будут оба к [STONES].[id].
Вот, собственно, я и не знаю, как спроектировать все так, чтоб можно было обеспечить каскадное удаление/обновление по двум FK?
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643055
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сфьщВот, собственно, я и не знаю, как спроектировать все так, чтоб можно было обеспечить каскадное удаление/обновление по двум FK? Вручную на клиенте или в удаляющей хранимке.
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643075
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257Вручную на клиенте или в удаляющей хранимке.
На клиенте хардкодить - не интересно.
Хранимая процедура конечно вариант, но мне интуитивно кажется, что есть какой-то стандартный подход проектирования для решения такой проблемы. Я же, в конце концов, не первый человек с подобной проблемой... просто с гугл тупит че-то :)
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643084
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сфьщSERG1257То бишь у вас нифига не дерево, а совсем даже граф. Тогда ваше решение
stones - узлы графа
MTF - дуги графа
Код: sql
1.
create table mtf (parent_id int references stones,child_id int references stones)


имеет место быть.

Проблема в том,что тогда нельзя прописать каскадное удаление для двух FK, только на один какой-нибудь, так как они привязаны будут оба к [STONES].[id]. Вот, собственно, я и не знаю, как спроектировать все так, чтоб можно было обеспечить каскадное удаление/обновление по двум FK?
Что ж вы сразу про проблему-то не сказали? Вас же небось, ещё и интересуют решения для конкретной СУБД?
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643090
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойЧто ж вы сразу про проблему-то не сказали? Вас же небось, ещё и интересуют решения для конкретной СУБД?

Каюсь, не сформулировал правильно проблему в первом посте, но тут, как вы видите, конкретно дошло дело до еще одной таблицы в процессе обсуждения, и соотв. проблема с FK, тоже возникла в процессе.
Конкретная СУБД - MS SQL 2008 R2, но я тему создал в этой ветке, ибо тут, как мне показалось, просто нужно правильно спроектировать.
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37643099
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сфьщ, проверь вариант:

MTF (stone_id int, depended_stone_id int, type_dependencies bool)...

оба id по FK на stone. по stone_id - каскадный...

первичный ключ на оба id...

если stone "1" является предком для "2" , делать две записи в MTF

1, 2, true
2, 1, false

в одной транзакции с клиента удалять все записи из MTF - иначе error...
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37644494
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатоЛойсфьщ, проверь вариант:

MTF (stone_id int, depended_stone_id int, type_dependencies bool)...

оба id по FK на stone. по stone_id - каскадный...

первичный ключ на оба id...

если stone "1" является предком для "2" , делать две записи в MTF

1, 2, true
2, 1, false

в одной транзакции с клиента удалять все записи из MTF - иначе error...

Нет, MS SQL, как оказалось, не разрешает использование каскадного обновления/удаления даже для одного FK для "самосвязи" много-ко-многиим (как написано - чтоб предотвратить возможность цикличного удаления/обновления).
Видимо, вариант с самоуправлением таблицей зависимостей - единственно возможный :(
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37644587
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сфьщ,
Хм, в Access все работает. Интересно, что будет если МигрейшнАссистентом на MS SQL попытаться перевести...
...
Рейтинг: 0 / 0
проблема ссылочной целостности
    #37645920
сфьщ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сфьщХм, в Access все работает. Интересно, что будет если МигрейшнАссистентом на MS SQL попытаться перевести...

Ничего не получится, выдаст такое же сообщение об ошибке, как при попытке создать каскадный FK в MS SQL.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / проблема ссылочной целостности
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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