Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > как реализовать отношение многие ко многим


Автор: megaproger 30.8.2006, 12:37
Есть 4 таблицы:

Таблица А:
ID - первичный ключ
Value - булевы данные

Таблица B:
ID - первичный ключ
Value - числовые данные

Таблица C:
ID - первичный ключ
Value - строковые данные

Таблица Б-отношения
ownerId  - Id из одной таблицы -любой (А или B или С) 
parentId -  Id из другой таблицы -любой (А или B или С) 

Как мне правильно организовать отношения между этими таблицами? какие связи использовать? может нужны какие то дополнительные таблицы?

Автор: Akina 30.8.2006, 12:42
Первое что зрится - это не (ownerId + parentId), а ((ownerId + ownerTable) + (parentId + parentTable)).
Второе - слить таблицы A,B,C в одну типа (ID, ValueBool, ValueNum, ValueStr).
Выбирай. 
А мож еще что придумается.

Автор: LSD 30.8.2006, 12:44
Можно создать таблицу Б в таком формате:
Цитата
AownerID - ID из таблицы A
BownerID - ID из таблицы B
CownerID - ID из таблицы C
AparentID - ID из таблицы A
BparentID - ID из таблицы B
CparentID - ID из таблицы C

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

Автор: DeadMan 30.8.2006, 12:46
на вскидку 3 решения
первое
 в таблицу Б ввести еще одно поле - писывающее откуда беруться данные 
(1 - AA 2- AБ.....)

второе
 в таблице Б 6 форен кеев
OwnerA OwnerA OwnerA
ParentA ParentB Parent C
(все могут быть Null)

третье
 все сделать в одной таблице

Id
BoolValue (может быть Null)
IntValue (может быть Null)
StringValue (может быть Null)
ParentId - ссылка на Id из этой же таблицы

Автор: Akina 30.8.2006, 13:39
Мне на самом деле навылет неясна логика создания 3 разных таблиц, хранящих данные одной сущности, кои различаются только типом данных. Гораздо логичнее была бы одна таблица со строковыми данными - ибо преобразование строки в число или булев тип, а равно и обратно, не должно вызывать проблем. А для отбора данных одного исходного типа ввести дополнительное поле.

Автор: DeadMan 31.8.2006, 13:44
Цитата(Akina @  30.8.2006,  13:39 Найти цитируемый пост)
Мне на самом деле навылет неясна логика создания 3 разных таблиц, хранящих данные одной сущности, кои различаются только типом данных. Гораздо логичнее была бы одна таблица со строковыми данными - ибо преобразование строки в число или булев тип, а равно и обратно, не должно вызывать проблем. А для отбора данных одного исходного типа ввести дополнительное поле.

а если надо посчитать сумму чисел (а у тебя в поле и числа и були и строки)

Автор: Akina 31.8.2006, 14:59
Цитата(DeadMan @  31.8.2006,  14:44 Найти цитируемый пост)
а если надо посчитать сумму чисел 
Например для MS Access это
Код
SELECT Sum(CDbl([Value])) AS NumberSum, ValueType
FROM table
GROUP BY ValueType
HAVING ValueType="N";
Аналогично для других БД.

Автор: LSD 31.8.2006, 22:01
Akina
1. Это медленней т.к. идет преобразование типов.
2. Пример явно демонстрационный и в реальной БД скорее всего будет не одно поле, а набор совершенно разных полей, плюс возможно внешние ключи из/на другие таблицы.
Так что думаю вопрос имеет право на существование, именно как академический: "А как можно реализовать подобные отношения?".

Автор: Akina 31.8.2006, 22:55
Цитата(LSD @  31.8.2006,  23:01 Найти цитируемый пост)
думаю вопрос имеет право на существование, именно как академический: "А как можно реализовать подобные отношения?". 

Понимаешь, я отношусь к этому так - сперва что-нить сделаем, а потом придумаем для чего мы это сделали. И будет у нас повод гордиться.

Сорри за оффтоп.

Автор: megaproger 1.9.2006, 09:14
А всё таки , что будет оправданее? Использовать три столбца в одной таблицы с разными типами ИЛИ использовать один строковый 
столбец и при помощи встроенных функций СУБД осуществлять приведение типов. 
Прошу высказать оценку с разных критериев:
- с точки зрения избыточности БД
- с точки зрения дискового пространства ,занимаемого таблицами(будут ли занимать место столбцы со значением  Null?).
- с точки зрения быстродействия  sql-запросов, если предполагается, что объем такой таблицы может быть более миллиона записей.И надо будет делать выборку и какие то статистические подсчеты по числовым типам.

Автор: LSD 1.9.2006, 10:24
Цитата(megaproger @  1.9.2006,  10:14 Найти цитируемый пост)
- с точки зрения дискового пространства ,занимаемого таблицами(будут ли занимать место столбцы со значением  Null?).

NULL значения занимают минимум дискового пространства (1-2 байта, в зависимости от СУБД). Хранение же например даты-времени в строке, будет требовать больше места чем в виде TIMESTAMP. Плюс гарантируется некая целостность данных, т.е. столбец NUMEBER всегда хранит только числа, и записать туда строку не удастся.

Цитата(megaproger @  1.9.2006,  10:14 Найти цитируемый пост)
- с точки зрения быстродействия  sql-запросов, если предполагается, что объем такой таблицы может быть более миллиона записей.И надо будет делать выборку и какие то статистические подсчеты по числовым типам.

Естетсвенно что необходимость преобразования типов на миллионах записей, потребует больших вычислительных мощностей. А вообще ты и сам можешь это проверить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)