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

голоса
0

Это возможно? Я имею в виду, может оба конца многие ко многие точки отношений к тем же таблицам?

Задан 10/12/2008 в 04:49
источник пользователем
На других языках...                            


2 ответов

голоса
1

Я не знаю, как вы могли бы сделать это без огромной, ужасной избыточности. Стандартный способ обработки многие-ко-многим между двумя столами осуществляется через третью таблицу, которая содержит два значения первичного ключа, один для первой таблицы, один для второй таблицы, с уникальным ограничением (чтения «индекс») на сочетание всех этих столбцов, и, возможно, с одним или двумя повторяющимися (неоднородными) индексами на отдельных первичных ключах. В общих чертах:

CREATE TABLE Table1 (pkcol1 ... PRIMARY KEY, ...);
CREATE TABLE Table2 (pkcol2 ... PRIMARY KEY, ...);
CREATE TABLE MtoM_Table1_Table2
(
     pkcol1 ... REFERENCES Table1,
     pkcol2 ... REFERENCES Table2,
     PRIMARY KEY (pkcol1, pkcol2)
);
-- CREATE INDEX fk1_mtom_table1_table2 ON MtoM_Table1_Table2(pkcol1);
-- CREATE INDEX fk2_mtom_table1_table2 ON MtoM_Table1_Table2(pkcol2);

Если ваша СУБД умна, вы можете пропустить отдельный индекс на ведущем столбце первичного ключа, поскольку индекс первичного ключа также можно использовать при поиске только ведущего значения.

Пусть Table1 и Table2 одни и те же таблицы (так, на самом деле, у нас есть только Table1), так как в этом вопросе; это, как правило, по-прежнему требует MtoM_Table1_Table1 таблицы отображения - отдельная таблицы из главной таблицы. Таблица отображения должна иметь отдельные имена для столбца ПК (первичный ключ), но оба колонок (или наборы столбцов) в таблице отображения будут ссылаться на столбец PK (ов) в табл.1.

CREATE TABLE Table1 (pkcol1 ... PRIMARY KEY, ...);
CREATE TABLE MtoM_Table1_Table1
(
     pkcol1 ... REFERENCES Table1(pkcol1),
     akcol1 ... REFERENCES Table1(pkcol1),
     PRIMARY KEY (pkcol1, akcol1)
);
-- CREATE INDEX fk1_mtom_table1_table1 ON MtoM_Table1_Table1(pkcol1);
-- CREATE INDEX fk2_mtom_table1_table1 ON MtoM_Table1_Table1(akcol1);

Если вы хотите, чтобы устранить таблицу сопоставления слишком, то вы должны иметь второй столбец в Table1, чтобы держать другое значение PK - назовем это FKcol1 (для столбца внешнего ключа). Это затем оставляет вас с дилеммой: что является первичным ключом? Это должно быть сочетание PKCol1 и FKCol1. Но FKCol1 должен ссылаться на первичный ключ другой строки - поэтому у вас есть противоречие. Даже если предположить, вам удалось избежать этого, как проблема (как именно?), Чтобы иметь «множество строк» ​​в ссылающейся стороне многие-ко-многим, вы должны иметь несколько строк в главной таблице с теми же данными все столбцы, кроме FKcol, но они будут ссылаться на номер (больше чем один, в целом) других строк в таблице. Это противоречие плюс кошмар избыточности, плюс вы потеряли простой первичный ключ,

CREATE TABLE Table1
(
    pkcol1 ... /* PRIMARY KEY */,
    fkcol1 ... /* FOREIGN KEY REFERENCES Table1(pkcol1) */,
    ...
);
-- CREATE INDEX fk1_table1 ON Table1(pkcol1);
-- CREATE INDEX fk2_table1 ON Table1(fkcol1);

Таким образом, я убежден, что единственный разумный ответ «Нет - вы не можете представить оба конца многие-ко-многим в той же таблице, вы должны использовать таблицу сопоставления сохранить много шансов что-либо рабочего„как обычно“ в системе".

Ответил 10/12/2008 в 05:49
источник пользователем

голоса
0

Если вы используете Hibernate-аннотации, есть @ManyToMany, не уверен в XML эквиваленте. Он должен появиться в документации API дистрибутива

Ответил 10/12/2008 в 04:50
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more