如何在数据库中简单地存储多个通讯组列表标准/逻辑?

时间:2014-07-22 16:07:32

标签: c# sql sql-server list

我需要根据以下两个输入从存储在数据库中的列表中选择一个分发列表

  • 单个客户类型(商业或住宅,一个或另一个,而不是两者,null不是有效输入)
  • 单个服务区域(SA1,SA2,SA3,SA4,唯一一个)

确定选择哪个列表的逻辑很简单,可以在存储过程中确定。

但是,在尝试存储每个分发列表的确定标准时会出现问题。分发列表的标准可以是客户类型(仅住宅,仅商业,住宅和商业)和服务区域的任何组合(例如,住宅SA1与商业SA1不同,不同于商业和住宅SA2)。我最初的解决方案是使用两列customerType和ServiceArea,并使用逗号分隔列表,其中包含每个分发列表的客户类型和服务区域。我想避免这种情况,以便我的数据库可以保持一些3NF的外观。我还想避免为每个客户类型和每个服务区域添加一列。

是否有办法存储此信息而不使用逗号分隔列表且每个值没有列,以便给定单个客户类型和单个服务区域的存储过程选择与该客户组合关联的分发列表类型和服务区域?

2 个答案:

答案 0 :(得分:1)

在大多数情况下,有充分的理由不将服务区域填充到逗号分隔列表中,但是,您要存储用户首选项设置,以便正常表格可以放宽一点如果服务区代码永远不会被删除或重命名,只会添加到。我认为这就像存储用户的颜色偏好,如果它不会导致系统崩溃然后做最简单的事情。

话虽如此,如果SA1,SA2,SA3 ......被删除和/或重命名,那么我使用列表。如果您需要使用3NF,则某些类似于以下的关系将起作用。

<强> CustomerServiceAreaFilter
CustomerServiceAreaFilterID(PK)
用户名(FK)
CustomerType(FK)
** UserID和CustomerType上的唯一索引

<强> CustomerServiceAreaFilterServiceArea
  CustomerServiceAreaFilterServiceAreaID(PK)
  CustomerServiceAreaFilterID(FK)
  ServiceAreaID(FK)
** CustomerServiceAreaFilterID ServiceArea上的Uniqe索引

答案 1 :(得分:0)

假设您的客户类型和服务区域具有与之关联的唯一编号,并且您知道每个客户类型和服务区域的上限,您可以说每个客户的属性可以通过执行以下操作转换为数字:

2 ^ customer type + (2 ^ service area) * 2 ^ (maximum customer type value)

在实践中,对于您的客户而言,这意味着每个客户都将拥有以下内容:

100010
100001
010010
010001
001010
001001

左4位是服务区的二进制,右2位是客户类型

您的条件表可以是三列之一:

| distribution_list_id | criteria_id | group |

在确定分发成员时,查询条件表以查找与分发列表的ID匹配的所有行,按group列分组并选择criteria_id的总和。从客户join到此条件表中选择所有行,其计算的位标志等于客户类型。 group列的目的是允许您将and个内容放在一起,而条件表中具有不同group值的单独行指示orand

假设您编写了记录良好的存储过程以插入这些表中,整个&#34;更改为位逻辑&#34;部分不应该太毛茸茸,目的是让你轻松地根据group sum group by {{1}}任意数量的标准,比字符串连接更容易一个{{1}})。这样,当客户不可避免地获得更多属性时,您可以在不更改架构的情况下为另一组属性添加更多位。

完全披露,我也不是很擅长数据库,但我认为这符合正常形式?如果没有,请让我知道为什么在评论中,也试着学习。

-Edited for typos