繁体   English   中英

可以创建多个连接表的路径吗?

Is it ok to create more than one path to join tables?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

假设我有一个用户表:

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `city_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `users_city_id_foreign` (`city_id`),
  CONSTRAINT `users_city_id_foreign` FOREIGN KEY (`city_id`) REFERENCES `cities` (`id`)
);

这链接到一个城市表:

CREATE TABLE `cities` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `country_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `cities_country_id_foreign` (`country_id`),
  CONSTRAINT `cities_country_id_foreign` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`)
);

这与国家表相关联:

CREATE TABLE `countries` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
);

我经常需要用户的国家名称。 我已经可以通过user->city->country访问国家名称:

SELECT `users`.`name`, `countries`.`name`
FROM `users` JOIN 
    (`cities` JOIN `countries` ON `cities`.`country_id` = `countries`.`id`)
    ON `users`.`city_id` = `cities`.`id`;

但我想直接访问,例如:

SELECT `users`.`name`, `countries`.`name`
FROM `users` JOIN `countries` ON `users`.`country_id` = `countries`.`id

可以像这样添加一个将用户表直接链接到国家表的外键,还是应该避免它?

ALTER TABLE `users` 
ADD COLUMN `country_id` BIGINT(20) UNSIGNED NOT NULL AFTER `city_id`,
ADD INDEX `users_country_id_foreign_idx` (`country_id` ASC);

ALTER TABLE `users` 
ADD CONSTRAINT `users_country_id_foreign`
  FOREIGN KEY (`country_id`)
  REFERENCES `countries` (`id`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;
1 个回复

通过将 country_id 添加到 users 表中,您会产生数据异常的风险。 您如何解释这些数据:

countries:
 1, UK
 2, US

cities:
 1, Little Whinging, 1
 2, New York, 2

users:
 1, Harry Potter, 1, 2

哈利波特怎么可能住在英国的一个城市,却被分配了一个与美国对应的country_id? 如果您将多余的 country_id 存储在 users 表中,则可能会出现这种异常情况。 您可以制作与自身不一致的数据。

您可以通过使用户中的 city_id 和 country_id引用城市表中的 city_id 和 country_id来解决此问题。 至少这可以防止异常,因为它必须引用该表中存在该对值的键(您必须首先在城市中创建一个两列键)。 但它仍然是多余的。

CREATE TABLE `users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `city_id` bigint(20) unsigned NOT NULL,
  `country_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `users_city_country_foreign` FOREIGN KEY (`city_id`, `country_id`)
    REFERENCES `cities` (`id`, `country_id`)
);
2 Hibernate:在多个连接表上创建属性的映射

我在数据库中有三个表(名为A,B和C): 我分别有A,B和C类。 从类“A”的代码中可以看出,我已经映射了类B的ID而不是对象,以下: 现在我需要为ID“C”执行此操作,即我可以直接获取A的关联C对象的ID a.getC_id(); 我怎样才能做到这一 ...

3 TSQL - 从具有多个连接路径的表中选择

这个标题不是很好,所以请考虑以下几点。 我有五张桌子: 我想获得直接链接到用户或通过配置文件间接链接的用户的所有权限。 到目前为止,我提出的不太合适的SQL是这样的: 它返回正确的行数,但它反复重复控制器或操作,所以这是错误的。 我希望有人可以帮我纠正它,以显示用户的所有不 ...

5 需要通过连接 Oracle DB 中的多个表来创建空表

通过连接两个表创建空表时出现错误。 我有两个表 tab1 和 tab2 ,两个表中有很多常见的列名。 我试过这个: 这给出了ORA-00957: duplicate column name 。 正如我上面提到的,这两个表之间有许多共同的列名。 如果我通过一个一个地编写大约 500 个列名来准备创建表 ...

7 创建带有XSLT 1.0的表并连接多个值

因此,我需要使用xslt 1.0创建一个动态表。 我看过几篇文章/帖子,但似乎无法将它们放在一起。 在许多情况下,将有几个带有空数据的表单元格。 在其他情况下,将有多个值需要串联到一个单元格中。 这是示例XML: 编辑:在HTML输出中,当用户名多次存在时,表单元格中有重复的值( ...

2014-02-13 00:57:59 2 1317   xml/ xslt
8 SQL-创建连接在一起的多个表的视图

我需要创建多个表的视图,这些视图已连接到称为artists的表,以便可以轻松引用它。 我正在努力处理视图中数据的排列。 我需要联接彼此独立地运行,因此没有数据重复。 我将给出到目前为止的查询,然后给出一些示例。 我将举一些示例,但为简单起见,仅包括所有内容的ID。 发生什 ...

2013-06-08 15:31:27 1 3811   mysql/ sql
9 通过连接到其他表创建多个值的平均值

我需要两个表来创建平均总和... 大篷车类别M:1辆大篷车(大篷车有一个类别,类别有许多大篷车) 大篷车( Caravan_no ,rental_amount,annual_rent .... 大篷车类别( Caravan_type_id ,car_type,宠物.... ...

10 Excel VBA 创建新的 PivotCache 并连接多个数据透视表

我有一个包含许多数据透视表的工作簿,这些数据透视表基于使用 VBA 删除和刷新的范围。 目前,为了更新数据源,作为该子例程的最后一部分,我为每个数据透视表重新创建数据透视缓存并刷新。 我只希望将 6 个表与一个公共 PivotCache 链接在一起,以便它们可以共享切片器等,但我无法使其正常工作。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM