Объединение таблиц - несколько строк в / из одного столбца (/ ячейка) - PullRequest
0 голосов
/ 30 мая 2011

Я искал решение для этой проблемы, но не нашел его (пока), вероятно, потому, что сам не знаю, как правильно это объяснить.Если оно уже где-то опубликовано, пожалуйста, дайте мне знать.

У меня есть три базы данных, которые связаны друг с другом;основной, штук и групп.По сути, основная база данных содержит наиболее элементарную / наиболее используемую информацию из поста, а база данных о материалах содержит данные, связанные с этим постом.База данных групп содержит все (длинные) имена групп, в которых можно «разместить» сообщение в основной базе данных.Сообщение может быть опубликовано в нескольких группах одновременно.Когда новое сообщение добавляется на мой сайт, я проверяю фрагменты, чтобы увидеть, есть ли дубликаты (проверьте, было ли уже опубликовано сообщение).Чтобы сделать поиск дубликатов более эффективным, я проверяю только те фрагменты, которые размещены в одной и той же группе.

Надеюсь, вы все еще со мной, потому что здесь это начинает сбивать с толкуЯ думаю (дайте мне знать, если мне нужно более четко указать вещи): сейчас и основная база данных, и база данных частей содержат полное имя группы (групп) (в основном я вообще не использую базу данных групп).То, что я хочу сделать, это заменить имена этих групп их связанными идентификаторами из базы данных групп.Например, я хочу изменить это:

из:

MAIN_table:

id |group_posted_in-------- | ---------------------------1 |группа_1, группа_52 |группа_15, группа_753 |группа_1, группа_215

GROUPS_table:

id |имя группы-------- | ---------------------------1 |группа 12 |group_23 |group_3так далее... в MAIN_table:

id |group_posted_in-------- | ---------------------------1 |1,52 |15,753 |1215Или что-то похожее на это.Однако этот формат вызывает определенные проблемы, так как следующий запрос вернет все строки (из примера), а не только ту, которая мне нужна:

SELECT * FROM main_table WHERE group = '5'

Мне нужно либо изменить запрос на что-то вродеthis:

...WHERE group = '5' OR group = '5,%' OR group = '%,5,%' OR group = '%,5'

Или мне нужно изменить структуру базы данных с разделенных запятыми значений на что-то вроде этого: [15] [75].Сопутствующий запрос будет проще, но мне кажется, что это громоздкое решение.Кроме того, (простые) объединения не будут легкими / невозможными вообще.Мне всегда нужно будет выполнить отдельный запрос для извлечения названий групп - ищет ли пользователь сообщения в определенной группе (в этом случае мне сначала нужно выполнить запрос, чтобы получить идентификаторы, а затем искатьсвязанные сообщения), или для их отображения (сначала сообщения, затем другой запрос для сопоставления групп).

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

Как правильно подключить базу данных группы к остальным?

1 Ответ

0 голосов
/ 30 мая 2011

Для отношений «многие ко многим» необходимо создать объединяющую таблицу. Вместо того, чтобы хранить список групп в одном столбце, вы должны разбить этот столбец на несколько строк в отдельной таблице. Это позволит вам выполнять на их основе набор функций и значительно ускорит работу базы данных, а также сделает ее более надежной и защищенной от ошибок.

Main
MainID ...

Group
GroupID GroupName

GroupsInMain
GroupsInMainID MainID(FK) GroupID(FK)

Итак, для MainID 1 у вас будут записи GroupsInMain:

1,1,1
2,1,5

Это связывает группы 1 и 5 с MainID 1

FK в этом случае означает внешний ключ (то есть ссылку на первичный ключ в другой таблице). Возможно, вы также захотите добавить уникальное ограничение для GroupsInMain для MainID и GroupID, поскольку вы никогда не захотите, чтобы одни и те же значения для пары отображались более одного раза.

Ваш запрос будет:

select GroupsInMain.MainID, Group.GroupName
    from Group, GroupsInMain
    where Group.GroupID=GroupsInMain.GroupID
        and Group.GroupID=5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...