主要思想是将区域中的多个ID存储到一列中。例子
Area A id=1
Area B id=2
我想是否可以将一栏保存到我的客户可以服务的区域。 例如,如果我的客户可以将两个服务都存储到一列中,那么我想像这样:
ColumnArea
1,2 //....or whatever area can service
然后,如果包含此ID,我想使用SQL查询来检索此客户。
Select * from customers where ColumnArea=1
有什么技巧或想法可以实现吗?
答案 0 :(得分:2)
您真的不应该这样做。
在单个列中存储多个数据点是不好的设计。
有关详细说明,请阅读Is storing a delimited list in a database column really that bad?,您会在很多地方看到为什么该问题的答案是绝对是!
在这种情况下,您想要做的是创建一个新表,该表与现有表有关系。在这种情况下,您可能需要多对多的关系,因为显然一个客户可以为多个区域提供服务,而我假设一个区域可以由多个客户提供服务。
多对多关系是通过连接两个包含数据的表与另一个包含数据之间的连接的表(又称为桥接表)来生成的。表之间直接存在的所有关系都是一对一或一对多的,并且存在桥接表这一事实使两个数据表之间的关系成为多对多关系。
所以您想要的数据库结构是这样的:
Customers Table
CustomerId (Primary key)
FirstName
LastName
... Other customer related data here
Areas Table
AreaId (Primary key)
AreaName
... Other area related data here
CustomerToArea table
CustomerId
AreaId
(Note: The combination of both columns is the primary key here)
然后您可以像这样为1区选择客户:
SELECT C.*
FROM Customers AS C
WHERE EXISTS
(
SELECT 1
FROM CustomerArea As CA
WHERE CA.CustomerId = C.CustomerId
AND AreaId = 1
)