Sql 多对多关系数据库设计
我有一个名为Sql 多对多关系数据库设计,sql,foreign-keys,schema,entity-relationship,Sql,Foreign Keys,Schema,Entity Relationship,我有一个名为config的表。每个config行都有一个与其关联的服务列表。 总共有10项特定的服务可用 我应该如何设计模式?config架构已存在。 这是我的想法,但不确定是否正确 config =================== config_id primary key col-1 col-2 ... col-n 我打算介绍一张新桌子 serviceconfigmap ======================================== config-
config
的表。每个config
行都有一个与其关联的服务列表。
总共有10项特定的服务可用
我应该如何设计模式?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\u id
列
这是正确的方法吗?欢迎有更好的主意
========================================
编辑
我理解,我错误地将我的需求称为一对多
,而不是多对多
。编辑我的问题
每个配置可以有多个服务,相同的服务可以在不同的配置之间共享。如果它纯粹是一个1->多个我只会在表服务中添加一个配置id
所以你的服务表看起来像
service_id (primary key)
config_id (foreign key)
col1
col2
...
coln
如果映射表是manymany
编辑
那么这不是一对多,而是多对多。您可能希望坚持使用已有的多对多表,但在列(config_id,service_id)上放置一个主键,以避免每个配置条目重复服务。当前的“config”表违反了第一个正常形式,因为它具有重复组(每个服务一个字段)。定义新服务时会发生什么?您必须更改“config”表的结构。因此,配置和服务之间的“连接表”是标准的方法
如果一个服务可以属于多个配置,那么连接表就成了必须的了。是的,您需要第三个表来存储两个表的外键。希望这对您设计的多对多关系有所帮助,因为配置有许多服务,并且服务可以包含在不同的配置中
为此,您需要有三个表,Config
、Service
和MappingTable
Config
=========
Config_ID => unique
Config_Name
.....
Service
=========
Service_ID => unique
Service_Name
.....
ConfigServiceMap
==================
Config_ID
Service_ID
.....
这不是一对多,而是多对多(如果我理解正确的话,一个配置可能有多个服务,一个服务可能属于多个配置)。阅读:如果您将config\u id
添加到services
表中,如何一次配置就可以有多个服务?不同的配置也可以共享相同的服务。为什么我要在两列上都放一个主键?我想根据config\u id
查询此表。所以,在config\u id
列上放置索引就足够了?主键,而不是索引。主键将确保不能插入同一条目两次。因此,您不能将confid\u id=1和service\u id=1的组合插入两次。如果我在2列组上放置一个主键,基于config\u id
的查询会更快吗<代码>从configservicemap(其中config\u id=1)中选择服务\u id,因为如果按顺序排列(config\u id,service\u id),它可能会使用该键,因为顺序确实会有所不同。你可能还想在上面加个索引。测试性能差异。在这种情况下,一个服务id
属于一个配置id
。我希望一个config\u id
具有多个service\u id
。另外,两个不同的config\u id
可以共享相同的service\u id
。我将根据config\u id
查询此表。那么,仅在这一列上添加索引就足够了?