Как в MySQL определяются отношения один ко многим и один к одному? - PullRequest
0 голосов
/ 26 октября 2018

Я имел в виду эти переходы в спящий режим: 1 , 2 .

Я не смог понять, как соотношения «один к одному» и «один ко многим» определены в таблицах MySQL.

Это SQL для отношения один ко многим:

CREATE TABLE `Cart` (
  `cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `total` decimal(10,0) NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `Items` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `cart_id` int(11) unsigned NOT NULL,
  `item_id` varchar(10) NOT NULL,
  `item_total` decimal(10,0) NOT NULL,
  `quantity` int(3) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `cart_id` (`cart_id`),
  CONSTRAINT `items_ibfk_1` FOREIGN KEY (`cart_id`) REFERENCES `Cart` (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

Это SQL для отношения один к одному:

-- Create Transaction Table
CREATE TABLE `Transaction` (
  `txn_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `txn_date` date NOT NULL,
  `txn_total` decimal(10,0) NOT NULL,
  PRIMARY KEY (`txn_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;

-- Create Customer table
CREATE TABLE `Customer` (
  `txn_id` int(11) unsigned NOT NULL,
  `cust_name` varchar(20) NOT NULL DEFAULT '',
  `cust_email` varchar(20) DEFAULT NULL,
  `cust_address` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`txn_id`),
  CONSTRAINT `customer_ibfk_1` FOREIGN KEY (`txn_id`) REFERENCES `Transaction` (`txn_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

1 Ответ

0 голосов
/ 27 октября 2018

На самом деле можно определить отношения 1: 1 в SQL. Есть два способа:

  1. Дочерняя таблица имеет тот же PK, что и родительская таблица, с теми же значениями. Этот столбец также является FK для родительской таблицы.

  2. Дочерняя таблица имеет другой PK. У этого также есть FK, который указывает на родительскую таблицу, и у этого FK есть УНИКАЛЬНОЕ ограничение.

Если вы заметили, в обоих случаях FK является УНИКАЛЬНЫМ (это PK или имеет УНИКАЛЬНОЕ ограничение), и это ключевой аспект. Невозможно создать вторую строку в дочерней таблице с тем же родителем.

Случай, который вы включили в свой вопрос, выбрал стратегию №1.

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