Является ли хорошей идеей добавить отношение из A в B и B в A в таблице отношений многие ко многим? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть таблица с такими отношениями между собой, как я.

TablaA
{
    IDTablaA bigint;
    Data varchar(200);
}

Relations
{
    ID bigint;
    IDRelated bigint;
}

Я хочу знать, какой элемент из Таблицы A связан с другими элементами Таблицы A. Поэтому сначала, независимо от того, каким образом, независимо от того, установил ли я в ID один идентификатор, а в IDRelated я установил другой или наоборот.

Я имею в виду, неважно, вставлю ли я (2,3) или (3,2), потому что в обоих случаях я буду знать, какие элементы связаны.

Так что запрос будет что-то вроде этого:

select * from TableAas t where

t.IDtableA IN(select r.IDRelated from Relations as r where r.ID = 2)
or
t.IDtableA IN(select r.ID from Relations as r.IDRelated = 2)

Так что я думаю, что я мог бы добавить две строки в среднюю таблицу (2,3) и (3,2). Я дублирую информацию, но если я хочу получить все элементы, связанные с 2, мне нужно искать только ID = 2, а не ID = 2 или IDRelated = 2;

Так что запрос будет примерно таким:

select * from TableAas t where

t.IDtableA IN(select r.IDRelated from Relations as r where r.ID = 2)

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

Так что я хотел бы знать, какой вариант лучше использовать: дублировать строки, чтобы иметь более простой запрос, или не дублировать их, но у меня будет более сложный запрос.

Спасибо.

1 Ответ

3 голосов
/ 25 мая 2019

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

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

Как правило, в системе OLTP вы предпочитаете проекты, которые исключают избыточное хранение данных, оптимизируя для простоты и производительности транзакции, которые добавляют или изменяют данные в базе данных. И поэтому вы по умолчанию сохраните только одну строку.

И наоборот, в системе OLAP вы оптимизируете для простоты и производительности исторических запросов. И поэтому вы по умолчанию сохраните оба.

Обратите внимание, что в системе OLTP, если вы сохраняете только одну строку, вы также хотели бы, чтобы ограничение CHECK вызывало ID < IDRelated, чтобы гарантировать, что вы не получите одно и то же отношение , введенное дважды. И если вы сохраните оба, вы захотите, чтобы триггер принудительно сохранял и обратное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...