【问题标题】:How MySQL one to many and one to one relationships are defined?MySQL 一对多和一对一关系是如何定义的?
【发布时间】:2018-10-26 20:25:13
【问题描述】:

我指的是 Hibernate tuts:12

我无法理解如何在 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;

如果眼睛没问题,我看不出两者有什么区别。是否像这种关系基数约束仅在休眠级别实现而不由数据库强制执行?还是我的眼睛漏掉了什么?

【问题讨论】:

  • 您的transactioncustomer 实体真的很奇怪。为什么您在某处没有客户 ID?
  • @GordonLinoff 我只是指链接文章
  • @TheImpaler 所以基本上在 SQL 级别这里和任何地方都没有任何东西可以寻找一对一的映射。所以它只在休眠层中实现...

标签: mysql sql hibernate


【解决方案1】:

实际上可以在 SQL 中定义 1:1 关系。有两种方式:

  1. 子表与父表具有相同的 PK,具有相同的值。此列也是父表的 FK。

  2. 子表有不同的 PK。它还有一个指向父表的FK,并且这个FK有一个UNIQUE约束。

如果您注意到,在这两种情况下,FK 都是唯一的(它是 PK,或者具有 UNIQUE 约束),这是关键方面。不能在具有相同父级的子表中创建第二行。

您在问题中包含的案例选择了策略 #1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2018-09-27
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多