Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多对多关系数据库设计_Sql_Foreign Keys_Schema_Entity Relationship - Fatal编程技术网

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
查询此表。那么,仅在这一列上添加索引就足够了?