多对多关系数据库设计
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
关系设计,因为配置有许多服务,并且服务可以包含在不同的配置中。
为此,您需要有三个表,Config
、Service
和 MappingTable
Config
=========
Config_ID => unique
Config_Name
.....
Service
=========
Service_ID => unique
Service_Name
.....
ConfigServiceMap
==================
Config_ID
Service_ID
.....
【讨论】:
我将根据config_id
查询这个表。那么仅在这一列上放置一个索引就足够了?【参考方案2】:
如果纯粹是1->many
,我只会在表中添加config_id
services
所以你的服务表看起来像
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
。以上是关于多对多关系数据库设计的主要内容,如果未能解决你的问题,请参考以下文章