基于数据库ID的引用

时间:2014-07-01 13:01:58

标签: database-design relational-database foreign-key-relationship

我有一个名为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_idservice_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

对此有哪些主要论据?是执行查询会更困难/更慢(例如,如果我想查看哪些分支执行特定服务)?结构化逗号是否有任何优势?

1 个答案:

答案 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_idbranch中的列branch_services的内容(branch_services中的service_id}之间的关系和services)。

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

你的问题是关于性能,在那之前真正的问题是“我可以用SQL查询这种结构吗?”是的,没有。

如果获得分支和服务的列表,比如我上面的查询,可能会非常复杂,要获得执行特定服务的分支仍然可行,毕竟如果需要检查谁New Sales你只需看看你的服务列表中是否有1,但排除所有10,11,12等等。嗯......不是那么直接。

我想告诉你的是,如果你需要将它与SQL一起使用而不是人脑,那么三个表结构就更灵活了。不幸的是,计算机还不是那么聪明。

所以:

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

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

一般?如果他们只需要暴露长逗号分隔的字符串,那么是的。