2012-08-17 2 views
1

Я пытаюсь создать структуру базы данных, используя передовую практику, но я не могу опустить голову над чем-то, что, я уверен, является основополагающим. БД предназначена для пользователей (100+) для подписки на журналы (100+), которые они читают.Простой дизайн таблицы базы данных

У меня есть таблица имен пользователей, информации о пользователях и журналах, но я не знаю, где следует перечислять журналы, которые каждый пользователь следует. Добавляю ли я столбец в таблицу пользователя и привязываю его к журнальному столу, или каждый пользователь будет настроен со своей собственной таблицей «follow», в которой указан журнал? Я смущаюсь, я думаю, что любая помощь будет замечательной.

С уважением

Райан

+1

Другая таблица, имеет идентификатор пользователя и идентификатор магазина. –

ответ

0

Прежде всего, вы должны понять, многие-ко-многим, как принять ваш пример пользователей и журналов. Сначала поймите сценарий: один пользователь может следить за множеством журналов, а за одним журналом могут следовать многие пользователи, поэтому между пользователями и журналами существует много-много отношений.

Всякий раз, когда существует связь между многими сущностями между многими, мы должны ввести третье сущность между ними, которое называется ассоциативной сущностью!

поэтому вы должны ввести третье лицо с именем по вашему выбору, и он будет, содержащий информацию о том, какой пользователь после чего журнал

вы можете пойти http://sqlrelationship.com/many-to-many-relationship/ для лучшего понимания с помощью диаграмм

4

То, что вы боретесь с называется many-to-many отношения.

Для решения этой проблемы вам нужен третий стол - возможно, он называется user_magazines. В этой третьей таблице должно быть два ключевых поля: один из таблицы пользователя, а другой из таблицы журналов. Например, столбец user_id и столбец magazine_id. Это называется compound key. С обоими этими столбцами вы теперь можете распознавать, какие книги были прочитаны любым пользователем.

Это лучше всего можно понять визуально:

enter image description here

На картинке выше вы можете увидеть, что третья таблица (середина таблицы, stock_category) позволяет нам знать, какой запас товар принадлежит к какой категории.

0

User_To_Magazine таблица, которая имеет две колонки - UserId и MagazineId, а ключ является составным, содержащий обе колонки

0

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

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

И, наконец, таблица subscriptions. это должно иметь автоматически увеличивающийся первичный ключ (на самом деле это не обязательно в этой таблице, но лично я бы добавил его), столбец user_ID и столбец journal_ID.

Чтобы добавить подписку, просто добавьте новую запись в таблицу подписки, содержащую идентификатор пользователя и идентификатор соответствующего журнала. Это позволяет пользователям подписываться на несколько журналов.

Если вы хотите получить фантазию, вы можете добавить ссылочные ограничения целостности в таблицу subscriptions - это сообщает системе управления базой данных, что конкретный столбец является ссылкой на другую таблицу и может указать, что делать при ее изменении (например, вы можете заставить СУБД автоматически удалять подписки, принадлежащие конкретному пользователю, если этот пользователь удален)

0

Вы должны создать отдельную таблицу под названием UserMagazineSubs. Введите UserID + MagazineTile ID в виде составного ключа.

В этой таблице будут отображаться все данные о связи User и Magazine.

0

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

Вам понадобится таблица соединений, в которой есть пользовательский идентификатор и журнал. Для каждого журнала, на который пользователь подписывается, будет одна запись в таблице соединений.

Я выводя немного о вашей структуре таблицы, но если вы имели:

User (id, login) 
Magazine (id, name) 
User_Magazine (userId, magazineId) 

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

Вы можете поместить запись в таблицу User_Magazine для каждой подписки.

И если вы хотите, чтобы увидеть все журналы пользователь с логином JDoe бы вы хотели сделать:

SELECT name 
    FROM User, Magazine, User_Magazine 
    WHERE login = 'jdoe' 
    AND User.id = User_Magazine.userId 
    AND Magazine.id = User_Magazine.magazineId 
Смежные вопросы