2011-10-09 3 views
1

Скажут, у меня есть newsletters, а затем subscribers:Денормализовать Многими ко многим, но не хочет, чтобы сохранить избыточные данные в SQL мире

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

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

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

+2

Почему/Как вы определили, что вам нужно хранить это избыточным образом? Если таблица «многие ко многим» правильно индексируется, поиск должен быть довольно простым. –

ответ

2

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

newsletter 
id, 
name, 
etc. 

subscriber 
    id, 
    last, 
    first, 
    etc. 

newsletter_subscriber 
    id, 
    subscriber_id, 
    newsletter_id, 
    other attributes, etc. 
3

Ваши 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 

пользователь А подписался х и у, пользователь Ъ подписался у. Вы также должны добавить индексирование после user_id и newsletter_id в таблицу подписчиков, а ПК должно быть (user_id,newsletter_id).