我有一个名为branch
的表,它将存储分支机构的详细信息,例如其经理,位置等。字段为:
branch_id
branch_manager
branch_location
此表中的数据如下所示:
1 Mr. John Doe Manhattan
2 Miss. Jane Doe Utah
3 Mr. Random Guy Somewhere
另一个名为services
的表存储了所有服务详细信息。字段是:
service_id
service_name
数据就像:
1 New Sales
2 After-Sales Support
3 Replacement
4 Exchange Offer
现在我想存储每个分支中可用的服务。通常我想这是通过创建一个名为branch_services
的新表来完成的,该表将包含branch_id
和service_id
。所以,如果我在branch_services
branch-id service-id
1 2
1 3
2 1
这意味着曼哈顿分公司负责售后支持和更换,而犹他州分公司只进行新销售。
现在我的问题是 - 如果我在分支表本身中存储了一个以逗号分隔的服务列表,那么如何使用这个branch_services
表呢?
1 Mr. John Doe Manhattan 2,3
2 Miss. Jane Doe Utah 1
3 Mr. Random Guy Somewhere
对此有哪些主要论据?是执行查询会更困难/更慢(例如,如果我想查看哪些分支执行特定服务)?结构化逗号是否有任何优势?
答案 0 :(得分:1)
您可以按照自己喜欢的方式存储数据(即您可以将文本字段设置为西里尔字母),但您还必须考虑要对数据执行的操作(即您希望存储英文单词和您而你的同事不懂西里尔字母。)
如果您正在使用关系数据库,我怀疑您将使用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_id
和branch
中的列branch_services
的内容(branch_services
中的service_id}之间的关系和services
)。
当然,我们可以理解2,3
在两个不同的行中与2
和3
相同,但SQL无法理解。 [实际上我们所做的是将2,3
字符串拆分为两个值,并将它们中的每一个与services
表中的一行相关联。在纯SQL中做到这一点并不那么简单。]
你的问题是关于性能,在那之前真正的问题是“我可以用SQL查询这种结构吗?”是的,没有。
如果获得分支和服务的列表,比如我上面的查询,可能会非常复杂,要获得执行特定服务的分支仍然可行,毕竟如果需要检查谁New Sales
你只需看看你的服务列表中是否有1,但排除所有10,11,12等等。嗯......不是那么直接。
我想告诉你的是,如果你需要将它与SQL一起使用而不是人脑,那么三个表结构就更灵活了。不幸的是,计算机还不是那么聪明。
所以:
是否可以在列中以逗号分隔存储数据?的是
是个好主意吗?如果您想在与另一个表的关系中使用它,通常否。
一般?如果他们只需要暴露长逗号分隔的字符串,那么是的。