Database design 基于数据库id的引用

Database design 基于数据库id的引用,database-design,relational-database,foreign-key-relationship,Database Design,Relational Database,Foreign Key Relationship,我有一个名为branch的表,该表将存储分支机构的详细信息,如其经理、位置等。字段包括: branch_id branch_manager branch_location service_id service_name 此表中的数据如下所示: 1 Mr. John Doe Manhattan 2 Miss. Jane Doe Utah 3 Mr. Random Guy Somewhere 还有另一个名为services的表,它存储所有服务详细信息。这

我有一个名为
branch
的表,该表将存储分支机构的详细信息,如其经理、位置等。字段包括:

branch_id
branch_manager
branch_location
service_id
service_name
此表中的数据如下所示:

1    Mr. John Doe      Manhattan
2    Miss. Jane Doe    Utah
3    Mr. Random Guy    Somewhere
还有另一个名为
services
的表,它存储所有服务详细信息。这些字段是:

branch_id
branch_manager
branch_location
service_id
service_name
数据如下:

1   New Sales
2   After-Sales Support
3   Replacement
4   Exchange Offer
现在我想存储每个分支中可用的服务。通常情况下,我想这是通过创建一个名为
branch\u services
的新表来完成的,该表将包含
branch\u id
service\u id
。因此,如果我在
branch\u services

branch-id  service-id
1          2
1          3
2          1
这意味着曼哈顿分行负责售后支持和更换,而犹他州分行只负责新的销售

现在我的问题是-如果我在分支表本身中存储一个逗号分隔的服务列表,而不是使用这个
分支服务
表,该怎么办

1    Mr. John Doe      Manhattan    2,3
2    Miss. Jane Doe    Utah         1
3    Mr. Random Guy    Somewhere

反对这一点的主要论点是什么?是否执行查询会更困难/更慢(例如,如果我想查看哪些分支提供了特定的服务)?通过构造逗号分隔是否有任何优势?

< P>你可以以你喜欢的方式存储你的数据(即你可以在西里尔字母表中拥有文本字段),但是你也要考虑你想用你的数据做什么(即你想存储英语单词,你和你的同事不知道西里尔字母)。 如果您使用的是关系数据库,我怀疑您将使用SQL。现在我可以编写如下查询:

select b.branch_location,
       s.service_name
  from branch b
inner join branch_services b_s 
        on b.branch_id = b_s.branch_id
inner join services s
        on b_s.service_id = s.service_id
获得:

branch_location service_name 
Manhattan       After-Sales Support 
Manhattan       Replacement 
Utah            New Sales
因为SQL是用来查询RDMS的,在我们的例子中,关系是
branch
branch\u services
(或
branch\u services
services
中的service\u id)列的内容之间的关系

当然,我们可以理解
2,3
在两个不同的行中的含义与
2
3
相同,但SQL无法理解这一点。[实际上,我们要做的是将
2,3
字符串拆分为两个值,并将它们分别关联到
服务
表中的一行。在纯SQL中做这件事并不是那么简单。]

您的问题是关于性能的,在达到这一点之前,真正的问题是“我可以用SQL查询这样的结构吗?”是和否

如果要获得分支机构和服务的列表,就像我上面的查询一样,可能会非常复杂,要获得提供特定服务的分支机构仍然是可行的,毕竟如果需要检查谁做了
新销售
,您只需查看服务列表中是否有1,但排除所有10、11、12等等。嗯。。。不是那么直截了当的

我想告诉大家的是,如果需要与SQL而不是人脑一起使用,三表结构更灵活。不幸的是,计算机还没有那么智能

因此:

是否可以在列中存储逗号分隔的数据

这是个好主意吗?如果要在与另一个表的关系中使用它,通常


通常?如果他们只需要公开逗号分隔的长字符串,那么是的

这个问题我只有一个答案,但它是最好的!谢谢!!我尽了最大努力,关系数据库有时遵循一种挑战性的逻辑。尽可能地简化设计和查询