2015-08-19 2 views
0

Я относительно новичок в разработке базы данных, и мне интересно, каков канонический способ реализации отношения многих и многих между строками в одной таблице.От многих до многих отношений в одной таблице?

В моем случае у меня есть таблица формул, и я хочу сказать, что две формулы в таблице, относится:

формулы таблица:

formula_id SERIAL PRIMARY KEY 
name TEXT NOT NULL 
formula TEXT NOT NULL 

Я предполагаю, что я хотел бы сделать новую таблицу называемые related_formulas, а затем сделать что-то вроде:

formula_relation_id SERIAL PRIMARY KEY 
formula_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE 
formula_id2 INT REFERENCES formulas (formula_id) ON DELETE CASCADE 

но потом предвидеть такие проблемы, как предотвращение двух идентификаторов в той же строке из, имеющих одинаковое значение. Я уверен, что есть и другие потенциальные проблемы, которые я не вижу из-за своей собственной неопытности.

Может ли кто-нибудь указать мне в правильном направлении?

+0

Как установить и формулу формулы и формулу в качестве первичных ключей, и использовать ту же формулу формулы для соответствующих формул? – Ray

+0

Это будет работать, если отношение эквивалентно, поэтому все члены класса эквивалентности имеют идентификатор; но отношение не обязательно эквивалентно. Например, «связанный с» не должен быть транзитивным: если 'i' связано с' A [i] 'и' A [i] ', относящимся к' A', 'i' не обязательно связано с' A '. – Amadan

+0

Почему две идентификаторы в одной строке не имеют одинакового значения? Или вы говорите, что могли, но не должны, и вы не знаете, как это предотвратить? – Amadan

ответ

1

От SERIAL я предполагал PostgreSQL ...

CREATE TABLE formula_relation (
    formula_relation_id SERIAL PRIMARY KEY, 
    formula1_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE, 
    formula2_id INT REFERENCES formulas (formula_id) ON DELETE CASCADE, 
    CHECK (formula1_id < formula2_id) 
); 

SQLFiddle

(я и предполагал, что ваше отношение симметрично, поэтому i быть связаны с A[i] также подразумевает A[i] связано с i, таким образом, наличие formula1_id < formula2_id гарантирует, что может быть только один, канонический, вариант строки, и вам не нужно проверять обратное сопряжение. Если отношение не симметрично, вы должны просто CHECK (formula1_id != formula2_id) .)

+0

Возможно, мне следовало сказать, что это PostgreSQL. Спасибо! – m0meni

Смежные вопросы