Хранение и выбор нескольких идентификаторов в базе данных - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть компонент новостной рассылки, и пользователи могут подписаться на несколько новостных рассылок. Он хранится в таблице подписчиков следующим образом: 4,8,11 (это идентификаторы информационных бюллетеней, на которые подписан подписчик)

Для выбора подписчиков на рассылку новостей я использую:

"SELECT * FROM #__newsl_subscribers WHERE newslids LIKE '%" . (int) $id."%'";

Когда я хочу выбрать всех пользователей, которые получают новостную рассылку с идентификатором 1, также выбирается пользователь, который получает новостную рассылку 11 (или 12, 10 и т. Д.). И это проблема.

Для этого есть оператор выбора? В противном случае я должен хранить идентификаторы с квадратными скобками вокруг них [1], [11] и т. Д. *

1 Ответ

5 голосов
/ 24 февраля 2011

Вам действительно следует избегать решений, в которых несколько идентификаторов хранятся в одном поле. Вместо этого вы должны использовать внешние ключи и, как в вашем случае для отношений n: m, таблицы отношений. n: m-отношения это где a может иметь несколько b и наоборот.

Я бы сделал следующее:

Таблица «Абонент»: Нет информации о новостях

Таблица «Рассылка»: Нет информации о подписчиках

Новая таблица "newsletter_subscriber" :
Поле: subscriber_id
Поле: newsletter_id
Оба поля являются внешними ключами (ссылки на первичный ключ другой таблицы).

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

SELECT s.* FROM subscriber s
INNER JOIN newsletter_subscriber ns ON ns.subscriber_id = s.id
WHERE ns.newsletter_id = <newsletter id>

И наоборот, чтобы выбрать все информационные бюллетени определенного подписчика:

SELECT n.* FROM newsletter n
INNER JOIN newsletter_subscriber ns ON ns.newsletter_id = n.id
WHERE ns.subscriber_id = <subscriber id>

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

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