Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

PostgreSQL наследование и fk   Найти похожие ветки 

 
Девушка ©   (2007-09-13 06:42) [0]

Добрый день!

В базе на PostgreSQL 8.2 есть следующие таблицы:
А1, А2- наследник А1, А3- наследник А1 и А21 - наследник А2
(напрмер они хранят данные о разных изделиях, здесь А1 - базовое изделие)

Есть таблица В. Для наглядности - пусть в ней хранится позиция заказа.
Т.е. в таблице В должна быть ссылка на данные в таблице изделий и все её дочерние таблицы.
Например, мы хотим чтобы в заказ можно было добавить А1 - простая штука, но можно было добавить и А2 - конкретная штука.
НО!
Если мы в таблицу В добавляем внешний ключ на таблицу А1, то Postgres воспринимает это слишком буквально :) и не дает добавлять туда данные из А2 и т.д....
Т.е. таблица В получилась у нас не таблицей Заказа всевозможных штук, а таблицей заказа простых штук.

как это обойти?
поддерживать ли FK иными средствами, либо создать наследников В1 и т.д.
но тогда видимо не получится создавать смешаные заказы...


 
Johnmen ©   (2007-09-13 18:28) [1]

Не очень понятно, что за "не дает добавлять туда данные из А2", но предполагаю, дело в том, что внешний(-ие) ключ(-и) должен(-ны) быть без констрейнтов (ограничений), которые мешают что-то там добавлять...


 
DrPass ©   (2007-09-14 11:51) [2]


> как это обойти?

Не использовать Постгресовские извраще... пардон, расширения. Сделай A2/A3 обычной отдельной таблицей, по FK ссылающейся 1 к 1 на A1, и хранящей детальную информацию для тех записей, которые касаются "конкретных штук"
Таблица B пусть ключуется на A1, которая просто будет единым каталогом изделий


 
Девушка ©   (2007-09-14 13:44) [3]


> быть без констрейнтов (ограничений), которые мешают что-
> то там добавлять...

вообщето первичный ключ - само по себе ограничение


 
Девушка ©   (2007-09-14 13:46) [4]


> Не использовать Постгресовские извраще... пардон, расширения.

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


 
Девушка ©   (2007-09-14 13:48) [5]

Привожу пример для лучшего понимания...

Есть родительская таблица справочник товаров. У нее есть дочерние таблицы типа столы, стулья, компьютеры и т.д. И есть таблица заказы. Родительская таблица "справочник товаров" и таблица "заказы" должны быть связаны внешним ключом.

но в Postgres както проблемно реализовано наследование, поэтому установка первичного ключа между "заказы" и "справочник товаров" создает ограничение: что связаны должны быть ТОЛЬКО таблицы "заказы" и "справочник товаров"  без учета наследования...

как это обойти?
(можно конечно попробовать "звезду смерти" :) )


 
Johnmen ©   (2007-09-14 14:52) [6]


> Девушка ©   (14.09.07 13:44) [3]
> > быть без констрейнтов (ограничений), которые мешают что-
> > то там добавлять...
> вообщето первичный ключ - само по себе ограничение

Я написал про FK, что читается как Foreign Key или Внешний Ключ.
Про первичный ничего не говорил...



Страницы: 1 вся ветка

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.043 c
15-1197899019
Eugen
2007-12-17 16:43
2008.01.20
Tech Lead


1-1192990151
dreamse
2007-10-21 22:09
2008.01.20
Ускорение работы FileExists


3-1189449856
DiX
2007-09-10 22:44
2008.01.20
Как правильно работать с TClientDataSet?


3-1189603544
alsov
2007-09-12 17:25
2008.01.20
fastreport dbcross запрос>500000строк


1-1192792154
ancot
2007-10-19 15:09
2008.01.20
Как узнать имя события в Run Time





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский