Может ли столбец внешнего ключа иметь многозначность в одной строке из той же таблицы ссылок? - PullRequest
1 голос
/ 24 апреля 2020

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

Вот моя таблица событий:

CREATE TABLE IF NOT EXISTS `mydb`.`EVENT` (
  `eventID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `eventCategory` INT UNSIGNED NOT NULL,
  `name` VARCHAR(45) NOT NULL,
  `eventDescription` VARCHAR(280) NULL,
  `date` DATETIME(1) NOT NULL,
  `locationDescription` VARCHAR(45) NOT NULL,
  `regionID` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`eventID`),
  INDEX `fk_EVENT_category_1_idx` (`eventCategory` ASC) VISIBLE,
  INDEX `fk_EVENT_region_1_idx` (`regionID` ASC) VISIBLE,
  CONSTRAINT `fk_EVENT_region_1`
    FOREIGN KEY (`regionID`)
    REFERENCES `mydb`.`REGION` (`regionID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_EVENT_category_1`
    FOREIGN KEY (`eventCategory`)
    REFERENCES `mydb`.`CATEGORY` (`categoryID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

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

Вот моя таблица категорий:

CREATE TABLE IF NOT EXISTS `mydb`.`CATEGORY` (
  `categoryID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `disorderID` INT UNSIGNED NOT NULL,
  `categoryDescription` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`categoryID`, `disorderID`),
  INDEX `fk_CATEGORY_disorder_1_idx` (`disorderID` ASC) VISIBLE,
  CONSTRAINT `fk_CATEGORY_disorder_1`
    FOREIGN KEY (`disorderID`)
    REFERENCES `mydb`.`DISORDERS` (`disorderID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

1 Ответ

2 голосов
/ 24 апреля 2020

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

Нет. Не понял этого. Это приведет к денормализации вашей схемы и сделает в дальнейшем простые вещи совершенно сложными.

У вас есть отношение многие ко многим между событием и категориями. Правильный способ представить это - создать третью таблицу, в которой каждая таблица событий / категорий хранится в отдельной строке.

Что-то вроде:

create table event_categories (
    event_id int not null,
    category_id int not null,
    primary key (event_id, category_id),
    foreign key(event_id) references event(event_id),
    foreign key(category_id) references category(category_id),
);
...