0

当新用户注册时,我很难为通知模块制定 SQL。

我有一个Notifications数据库,我设置了要发送的通知。例子:

  • 当男人和蓝眼睛注册时发送通知;
  • 女性注册时发送通知;
  • 当一个蓝眼睛的女人,棕色并在 Foo 公司工作时发送通知;

通过这些规则,我们可以看到有多种可能性(因此表格列是可选的)。

一些细节:

  • 表列被定义为整数,因为是 FK。我只是没有放表,因为结构是不必要的,因为 SQL 只会在用户和通知之间发生关系;
  • 日期字段用于存储此人的通知登记日期。所以我只能过滤通知用户的新注册;

表结构

用户:
 +------------+----------+------+-----+---------+-- ----------+
 | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
 +------------+----------+------+-----+---------+-- ----------+
 | 身份证 | 整数(11) | 否 | 优先级 | | 自动增量 |
 | 性别 | 整数(11) | 是 | | | |
 | 染发 | 整数(11) | 是 | | | |
 | 眼睛颜色 | 整数(11) | 是 | | | |
 | 公司 | 整数(11) | 是 | | | |
 | 日期 | 日期时间 | 否 | | | |
 | ... | | | | | |
 +------------+----------+------+-----+---------+-- ----------+

  通知:
 +------------+----------+------+-----+---------+-- ----------+
 | 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
 +------------+----------+------+-----+---------+-- ----------+
 | 身份证 | 整数(11) | 否 | 优先级 | | 自动增量 |
 | 性别 | 整数(11) | 是 | | | |
 | 染发 | 整数(11) | 是 | | | |
 | 眼睛颜色 | 整数(11) | 是 | | | |
 | 公司 | 整数(11) | 是 | | | |
 | 日期 | 日期时间 | 否 | | | |
 +------------+----------+------+-----+---------+-- ----------+

最初的想法

我最初的想法是为每种可能性进行选择并通过联合加入:

-- 按性别通知选择新用户
选择 *
来自通知
内部加入用户(
    User.Date >= Notification.Date 和
    Notification.Gender = User.Gender 和
    Notification.HairColor 为空并且
    Notification.EyeColor 为空并且
    Notification.Company 为空
)

联合所有

-- 按性别和发色通知选择新用户
选择 *
来自通知
内部加入用户(
    User.Date >= Notification.Date 和
    Notification.Gender = User.Gender 和
    Notification.HairColor = User.HairColor 和
    Notification.EyeColor 为空并且
    Notification.Company 为空
)

-- ... 以此类推,对每个选项做一个选择,结果是16个选择(4列:性别、头发颜色、眼睛颜色和公司)

我的问题是:

有没有另一种方法可以让我更轻松地查询通知的所有可能性?
按照这种 4 列的结构,我们已经有 16 个选择。在我的真实结构中,将有更多的列,其中有些东西无法保持这种状态。
是否有其他建议的数据存储结构以更好地执行此功能?

4

3 回答 3

1
SELECT * 
FROM Notification
inner join User on (
    User.Date >= Notification.Date and
    (Notification.Gender is null or Notification.Gender = User.Gender) and
    (Notification.HairColor is null or Notification.HairColor = User.HairColor) and
    (Notification.EyeColor is null Notification.EyeColor = User.EyeColor) and
    (Notification.Company is null or Notification.Company = User.Company)
)

这样,您就可以通过存储在表中的通知获得每组用户。

于 2013-07-10T01:12:53.440 回答
0

这是我实现此用户注册/通知功能的方式:

  1. 三个表:Users、Notif_type、Notif_queue。
  2. 在表用户上插入的触发器,它调用存储过程 SendNotification(user_id)。
  3. 存储的过程将具有您可以更改超时而无需修改架构/数据的逻辑。逻辑将是:
    • 根据您的规则选择新用户应收到的通知类型(表单 Notif_type);
    • 在 Notif_queue 中插入一行,该行包含对 user_id 和 notif_type_id 的 FK,以便通知用户的功能与通知规则完全分离。
于 2013-07-10T01:44:21.077 回答
0

为什么你不能只使用一个表“用户”并放置一个名为 [Notified] 的额外字段/标志,以便每次你想发送通知时只需将其引用到标志。

我发现使用通知表无关紧要。

于 2013-07-10T01:46:50.203 回答