database-design - 如何使用 MySQL 表表示规则?

标签 database-design mysql

我有一个包含 100,000 个用户(姓名、年龄、性别、电话、公司、街道、城市、州、国家、邮政编码等)的表格。

我还有一张表格,其中包含向用户提供的数千个促销事件。现在,对于每个促销,我都需要添加一个规则来定义它适用于哪个用户子集。

例如,规则可能是:邮政编码为 10000 到 19999 的所有用户。

另一个规则可能是:所有女性用户且不居住在美国

第三条规则可能是:居住在哥伦比亚特区、马里兰州或弗吉尼亚州的 18 岁以上用户。 等等等等

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

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

最佳答案

这是一种方法。

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

现在变得复杂了。每个规则项也是一个级别。这样您就可以进行 AND 和 OR 比较,因为它们需要层次结构。我之前这样做的方法是偶数级别 AND 和奇数级别 OR。这意味着对于规则必须为真的两个项目都将处于级别 0,也就是说,它们必须都有效。对于具有一个强制条件和另外两个条件(其中任何一个都为真)的规则,即 1 AND (2 OR 3),您将强制规则置于级别 0,将另外两个置于级别 1。

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

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

关于database-design - 如何使用 MySQL 表表示规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760315/

相关文章:

sql - 我有每条记录的 StartDate 和 EndDate。在这两个字段中使用时,我应该赋予 NULL 特殊含义吗?

mysql - 寻找该库存系统的最佳结构

mysql - 试图避免多个父表

php - “跟随”或 'Subscribe' 方法

php - 如何从 PHP 转储整个 MySQL 内容?

php - 哎呀,没有选择数据库 php

mysql - 无法使用 Homebrew 程序连接到本地 MySQL 服务器

SQL 服务器 : Use a column to save order of the record

mysql - 查询无休止地运行(嵌套游标/循环)- MySQL

mysql - Yii 框架,提交表单后文本字段不会在数据库中更新