如何在数据库中简单地存储一些分布列表标准/逻辑?

本文关键字:列表 分布 标准 逻辑 存储 数据库 简单 | 更新日期: 2023-09-27 18:14:03

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

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

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

然而,当试图存储每个分发列表的确定标准时,问题就出现了。通讯组列表的标准可以是客户类型(仅限住宅、仅限企业、住宅和企业)和服务区域的任意组合(例如,住宅SA1不同于业务SA1,不同于业务和住宅SA2)。我最初的解决方案是使用customerType和ServiceArea两列,并使用逗号分隔列表,其中包含每个分发列表的客户类型和服务区域。我想避免这种情况,以便我的数据库可以保持一些3NF的外观。我还希望避免为每种客户类型和每个服务区域设置一列。

是否有一种方法可以不使用逗号分隔的列表和每个值的列来存储此信息,以便给定单个客户类型和单个服务区域的存储过程选择与该客户类型和服务区域组合绑定的分布列表?

如何在数据库中简单地存储一些分布列表标准/逻辑?

在大多数情况下,不将服务区域填充在逗号分隔的列表中是有很好的理由的,但是,您正在存储用户首选项设置,因此如果服务区域代码从未被删除或重命名,而只是添加到其中,则Normal Forms可以稍微放松一点。我认为这就像存储用户的颜色偏好,如果它不会导致系统崩溃,那么就做最简单的事情。

话虽如此,如果SA1,SA2,SA3…我将而不是为此使用列表。如果你需要使用3NF,一些类似于下面的关系会起作用。

CustomerServiceAreaFilter
CustomerServiceAreaFilterID (PK)
UserID(颗)
CustomerType(颗)
** UserID和CustomerType的唯一索引

CustomerServiceAreaFilterServiceArea
CustomerServiceAreaFilterServiceAreaID (PK)
CustomerServiceAreaFilterID(颗)
ServiceAreaID(颗)
** CustomerServiceAreaFilterID ServiceArea的唯一索引

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

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 |

在确定分布的成员时,查询您的criteria表中匹配分布列表id的所有行,按group列分组并选择sum of criteria_id。根据计算出的位标志等于客户的类型,从客户join中选择所有行到此标准表。group列的目的是允许您将and的东西放在一起,而在标准表中具有不同group值的单独行表示or

假设您编写了文档良好的存储过程来插入到这些表中,那么整个"转换为位逻辑"部分应该不会太麻烦,其目的是允许您轻松地基于group对任意数量的标准执行and (sumgroup by中的字符串连接要容易得多)。这样,当客户不可避免地获得更多属性时,您可以在末尾为另一组属性添加更多位,而无需更改模式。

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

-编辑错别字