Database design 如何使用MySQL表表示规则?

Database design 如何使用MySQL表表示规则?,database-design,mysql,Database Design,Mysql,我有一张10万用户的表格(姓名、年龄、性别、电话、公司、街道、城市、州、国家、邮编等) 我还有一个表,上面有数千个向用户提供的促销活动。现在,对于每个促销,我需要添加一个规则,定义它应用于哪些用户子集 例如,规则可能是:zipcode为10000到19999的所有用户 另一条规则可能是:所有非美国籍女性用户 然而第三条规则可能是:居住在DC、MD或VA的18岁以上用户。 等等 现在给定一个特定的用户,我想(高效地!)找出哪些促销适用于该用户 考虑到我希望能够快速找到与特定用户匹配的促销活动,对这

我有一张10万用户的表格(姓名、年龄、性别、电话、公司、街道、城市、州、国家、邮编等)

我还有一个表,上面有数千个向用户提供的促销活动。现在,对于每个促销,我需要添加一个规则,定义它应用于哪些用户子集

例如,规则可能是:zipcode为10000到19999的所有用户

另一条规则可能是:所有非美国籍女性用户

然而第三条规则可能是:居住在DC、MD或VA的18岁以上用户。 等等

现在给定一个特定的用户,我想(高效地!)找出哪些促销适用于该用户


考虑到我希望能够快速找到与特定用户匹配的促销活动,对这些规则进行建模的好策略是什么?

这通常不是在数据库级别进行的;相反,“规则”将由后端解释(无论您在后端使用何种语言)。它们在数据库中的存储方式取决于它们的建模方式。这种方法可以是简单的,也可以是复杂的,因为它需要-规则可以由您的最终用户动态定义,等等


这就是说,如果您正在寻找快速而肮脏(非常强调肮脏)的解决方案,您也许可以将规则存储为实际查询(或
where
查询条件)。然后,您可以编写一个存储过程来应用所述规则。

告诉我,您的规则实际上可以是任何东西,并且可以通过不同的查询更好地表示出来

它们应该进入模型(MVC)或者可能进入存储过程。我真的拿不定主意

每次新的促销活动进入城镇,系统都会检查所有用户,并将匹配项存储到链接用户和促销活动的表中。这也适用于每一个注册的新用户。你也可以考虑把它放进一个工作岗位。

编辑:
请注意,如果您确实在寻找性能,那么将用户直接链接到促销活动的表格是至关重要的


只要我的两分钱。

如果您以“类似SQL”的形式存储规则,会怎么样?例如,您有一个用户表和一个促销表,正如您已经提到的

您可以添加两个新表,升级规则和升级规则。促销规则将包含这些规则,促销规则将给定促销链接到其关联规则。此设计允许您共享多个促销的相同规则

在升级规则中,您可以存储一个名为RULE\u SQL的列,并且可以存储如下值:

(gender != 'F' and country != 'US')    
(age > 18 and state IN ('DC','MD','VA')
等等


然后,您可以查找适用于升级的规则,并动态构建由规则SQL值组成的SQL语句。

这取决于输入规则的人以及您对规则的信任程度。如果添加规则的是您,那么您可以将它们作为SQL语句存储在数据库中,但这似乎有点老套,或者作为存储过程,但我不确定是否可以有一列引用这些规则(当然可能是字符串列)

您不会说您使用的是什么样的框架,但是如果您使用的是ORM,那么您的规则可以是查询对象,这些对象可以作为BLOB序列化到数据库中。例如,如果您正在使用SQLAlchemy For Python,则每个规则都可以是可以传递给User.filter函数的查询实例

在所有这些情况下,您都允许注入任意代码,因此它们不适合允许其他人添加规则。唯一好的解决方案是创建一种有限的特定于域的语言来表达规则,并将其转换为SQL或您的ORM语言。

这里有一种方法

如果您可以将每个规则分解为一个简单的比较,那么就有可能以一种适用于所有情况的方式存储它。最终得到的是一系列规则项,包括一个字段、一个值和一个比较(例如等于、不等于等)。它们还需要属于一个实际的规则(您可以命名),该规则将列在另一个表中

现在事情变得复杂了。每个规则项也有一个级别。这是因为你可以做和或比较,因为它们需要继承权。我以前这样做的方式是偶数和奇数。这意味着规则中必须为true的两个项都将处于级别0,也就是说,它们都必须进行验证。对于具有一个强制条件和两个以上条件(其中一个条件为真)的规则,即1和(2或3),将强制规则置于级别0,将其他两个置于级别1

这种方法的优点是,用于组装SQL过滤器的代码获得了正确的嵌套,因为它必须获得正确的AND/OR模式。它还可以为规则构建编辑器


但是,与所有其他解决方案一样,此解决方案仍然需要将所有规则依次应用于用户集,以找到哪些规则允许您感兴趣的用户使用。

鉴于大家一致认为我应该将规则存储为SQL查询,是否有一种工具可以交互构建此类查询?我正在运行PHP/CakePHP/MySQL。谢谢是的,我是那个加入规则的人。我明白你说的关于“规则语言”——到查询的转换。关于定义这些规则并转换为SQL查询的工具有什么线索吗?这太棒了。非常感谢。