Денормализовать многие ко многим, но не хотят хранить избыточные данные в мире SQL - PullRequest
1 голос
/ 09 октября 2011

Скажем, у меня есть newsletters, а затем subscribers:

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

Должен ли я хранить это в newsletter table или в user table?Т.е. должен ли бюллетень хранить список подписчиков или пользователь должен хранить список рассылок, на которые он тоже подписался?Оба случая будут широко использоваться.Пользователю нужно будет также показать рассылки, на которые он подписан, а в рассылках - пользователи, подписавшиеся на него.

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

Ответы [ 2 ]

3 голосов
/ 09 октября 2011

Ваши таблицы Users и Subscribers одинаковы? Если нет, то они должны быть. Таблица Users должна содержать ваших пользователей, таблицу Newsletters, ваши информационные бюллетени и ваше Subscribers отношение между ними.

Скажем, у вас есть:

Пользователи

user_id    name
1          a
2          b
3          c

Информационные бюллетени

newsletter_id   name
1               x
2               y
3               z   

Подписчики

user_id   newsletter_id
1         1
1         2
2         2

Пользователь a подписан на x и y, пользователь b подписан на y. Вы также должны добавить индексирование после user_id и newsletter_id в таблицу подписчиков, а PK должен быть (user_id,newsletter_id).

2 голосов
/ 09 октября 2011

Это то, для чего предназначены таблицы «многие ко многим».Вы храните отношения между ними в отдельной таблице.Пример:

newsletter
 id,
 name,
 etc.

subscriber
  id,
  last, 
  first,
  etc.

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