多对多关系数据库设计

Posted

技术标签:

【中文标题】多对多关系数据库设计【英文标题】:Many to Many relation DB design 【发布时间】:2012-09-30 12:39:30 【问题描述】:

我有一个名为config 的表。每个config 行都有一个与之关联的services 列表。 共有 10 个特定的services 可用。

我应该如何设计架构? config 架构已存在。 这是我的想法,但不确定是否正确。

config
===================
config_id primary key  
col-1  
col-2  
...  
col-n

我计划推出一个新表。

serviceconfigmap 
======================================== 
config-id # foreign key to config table  
svc_id    # service identifier

这种方法的问题在于,serviceconfigmap 表将为每个 config-id 复制 svc_id

这是正确的方法吗?欢迎任何更好的想法

=========================================

编辑

我了解我错误地将我的要求称为One-to-Many 而不是Many-to-Many。编辑了我的问题。

每个配置可以有多个服务,并且可以在不同的配置之间共享同一个servoce。

【问题讨论】:

这不是一对多,而是多对多(如果我理解正确的话,一个配置可能有多个服务,一个服务可能属于多个配置)。阅读:***.com/questions/7296846/… 【参考方案1】:

您正在为Many-To-Many 关系设计,因为配置有许多服务,并且服务可以包含在不同的配置中。

为此,您需要有三个表,ConfigServiceMappingTable

Config
=========
Config_ID         => unique
Config_Name
.....

Service
=========
Service_ID        => unique
Service_Name
.....

ConfigServiceMap
==================
Config_ID         
Service_ID
.....

【讨论】:

我将根据config_id查询这个表。那么仅在这一列上放置一个索引就足够了?【参考方案2】:

如果纯粹是1->many,我只会在表中添加config_idservices

所以你的服务表看起来像

service_id (primary key)
config_id (foreign key)
col1
col2
...
coln

只有many<->many的映射表才需要

编辑

那么这不是一对多,而是多对多。您可能希望坚持使用多对多表,但在列 (config_id, service_id) 上放置一个主键,以免每个配置条目重复服务。

【讨论】:

如果将config_id添加到services表中,如何一次配置可以有多个服务?不同的配置也可以共享同一个服务。 为什么要在两列上都放一个主键?我想根据config_id查询这个表。那么,在config_id 列上放置一个索引就足够了吗? 主键,不是索引。主键将确保您不能两次插入相同的条目。所以你不能两次插入 confid_id = 1 和 service_id = 1 的组合。 如果我将主键放在2列组上,基于config_id的查询会更快吗? SELECT service_id from configservicemap where config_id = 1 稍微,因为如果您将其按顺序排列(config_id,service_id),它可能会使用密钥,因为顺序确实会有所不同。你可能还想在上面放一个索引。测试看看性能有什么不同。【参考方案3】:

目前的“配置”表违反了第一种正常形式,因为它具有重复组(每个服务一个字段)。定义新服务时会发生什么?您将不得不更改“配置”表的结构。因此,配置和服务之间的“连接表”是标准方法。

如果一个服务可以属于多个配置,那么连接表就成为必须的。

【讨论】:

【参考方案4】:

是的,您是对的,您将需要第三张表来存储两个表的外键。希望对您有所帮助

【讨论】:

在这种情况下,一个service_id 属于一个config_id。我希望一个config_id 有多个service_id。另外 2 个不同的 config_id 可以共享相同的 service_id

以上是关于多对多关系数据库设计的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PowerDesigner软件进行数据库设计(多对多关系)

数据库表中多对多关系怎么设计?

数据库表设计(一对多,多对多)

数据库设计中,多对多关系使用使用逗号分割关联讨论

数据库 一对多,多对多 表设计

数据库 一对多,多对多 表设计