Соединительные таблицы с неуникальной записью - PullRequest
0 голосов
/ 28 июля 2011

Я начинаю создавать веб-приложение для сбора марок.Бэкэнд Python / фляга (я думаю :)) MySQL как DB.Я не очень разбираюсь в дизайне БД, поэтому, пожалуйста, имейте это в виду, если я сделаю какую-то действительно глупую ошибку в том виде, в котором я это придумал.Я думал разбить данные на 3 таблицы.

  • таблица пользователей (все пользователи должны быть добавлены при регистрации в этой таблице)
  • таблица марок (все марки должны находиться здесь иизменено только мной)
  • таблица, находящаяся в собственности (таблица соединений с внешними ключами user_id и stamp_id)

Вопрос: если я добавлю user_id и stamp_id в качестве первичного ключа, будет только одинуникальная запись этого типа, например, user_1 имеет card_1.Но у user_1 может быть дубликат card_1, поэтому у меня должно быть 2 строки user_1 card_1 user_1 card_1 Другая проблема, которая возникает, заключается в том, что я хочу включить печать состояния, принадлежащего государству.Например, user_1 может иметь card_1 в отличном состоянии и card_1 в плохом состоянии.Насколько я понимаю, я могу ввести только одну уникальную пару user_1 card_1.Что я могу сделать, чтобы получить желаемый результат?Также, если есть лучший способ сделать это, пожалуйста, дайте мне знать.

Дополнительный вопрос.Я использовал mysql workbench, чтобы попытаться построить db, поэтому у меня есть вопрос о sql, который он генерирует.ОГРАНИЧЕНИЕ "fk_gibberish", это нормально или ... почему это так?

CREATE  TABLE IF NOT EXISTS `stampcollect`.`users` (
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `user_username` VARCHAR(45) NULL ,
  `user_password` VARCHAR(45) NULL ,
  `user_email` VARCHAR(45) NULL ,
  PRIMARY KEY (`user_id`) )

CREATE  TABLE IF NOT EXISTS `stampcollect`.`stamps` (
  `stamp_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `stamp_name` VARCHAR(45) NULL ,
  PRIMARY KEY (`stamp_id`) )

CREATE  TABLE IF NOT EXISTS `stampcollect`.`owned` (
  `user_id` INT NOT NULL ,
  `stamp_id` INT NOT NULL ,
  `stamp_status` BIT NULL ,
  PRIMARY KEY (`user_id`, `stamp_id`) ,
  INDEX `fk_{F5DBEF0D-24E0-4AFF-A5CB-2A6A0D448C96}` (`stamp_id` ASC) ,
  CONSTRAINT `fk_{22B4468E-A5FB-4702-A8A9-576AA48A0543}`
    FOREIGN KEY (`user_id` )
    REFERENCES `stampcollect`.`users` (`user_id` ),
  CONSTRAINT `fk_{F5DBEF0D-24E0-4AFF-A5CB-2A6A0D448C96}`
    FOREIGN KEY (`stamp_id` )
    REFERENCES `stampcollect`.`stamps` (`stamp_id` ));

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Если пользователи могут владеть одним и тем же штампом в нескольких состояниях, то состояние должно быть в таблице «в собственности» и быть частью ключа. Если он может иметь несколько копий одного и того же штампа, то имеет смысл иметь столбец «количество» в этой таблице (а не часть ключа).

0 голосов
/ 28 июля 2011

Добавьте поле id с автоинкрементом в таблицу owned и сделайте его первичным ключом.

Что касается другого вопроса: это просто Workbench, генерирующий уникальный идентификатор для вашего внешнего ключа.Вы можете переименовать их, просто оставьте их уникальными.

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