【问题标题】:Database messaging for multiple model types - user, group, global多种模型类型的数据库消息传递 - 用户、组、全局
【发布时间】:2014-02-15 12:26:10
【问题描述】:

我想在网站中实现一个警报消息系统,它将向多个用户、多个(不同的数据库表示)或全球对所有用户。

这种行为的良好数据库关系应该是什么样的?

【问题讨论】:

    标签: database database-design orm django-models relational-database


    【解决方案1】:

    根据您提供的信息,我将从这里开始......

    用于发送警报消息的表格...

    alerts
        id      unsigned int(P)
        message text
    
    +----+---------------------+
    | id | message             |
    +----+---------------------+
    |  1 | The sky is falling! |
    |  2 | Some other message  |
    | .. | ................... |
    +----+---------------------+
    

    保存所有组信息的表...

    groups
        id          unsigned int(P)
        name        varchar(20)
    
    +----+---------+
    | id | name    |
    +----+---------+
    |  1 | Group A |
    |  2 | Group B |
    | .. | ....... |
    +----+---------+
    

    用于关联组和警报的表。每列都是其各自表的外键,它们一起形成一个主键 - 这将确保没有一个组与同一个警报多次关联。 在我的示例数据中,我们看到 A 组同时注册了“天要塌了!”和“其他消息”消息,而 B 组仅注册了“其他消息”警报。

    groups_alerts
        alert_id        unsigned int(F alerts.id)--\_(P)
        group_id        unsigned int(F groups.id)--/
    
    +----------+----------+
    | alert_id | group_id |
    +----------+----------+
    |        1 |        1 |
    |        1 |        2 |
    |        2 |        2 |
    | ........ | ........ |
    +----------+----------+
    

    用户信息表...

    users
        id              unsigned int(P)
        username        varchar(32)
        password        varbinary(255)
        ...
    
    +----+----------+----------+-----+
    | id | username | password | ... |
    +----+----------+----------+-----+
    |  1 | bob      | ******** | ... |
    |  2 | mary     | ******** | ... |
    |  3 | john     | ******** | ... |
    | .. | ........ | ........ | ... |
    +----+----------+----------+-----+
    

    将用户与警报相关联的表。这些键遵循与groups_alerts 表中相同的逻辑。在我的示例数据中,我们看到john 注册了“天要塌了!”消息。

    users_alerts
        user_id     unsigned int(F users.id)---\_(P)
        alert_id    unsigned int(F alerts.id)--/
    
    +---------+----------+
    | user_id | alert_id |
    +---------+----------+
    |       3 |        1 |
    | ....... | ........ |
    +---------+----------+
    

    最后我们需要将用户与组关联起来。这些键遵循与groups_alerts 表中相同的逻辑。在我的示例数据中,我们看到bobGroup A 的成员,而maryGroup B 的成员。

    users_groups
        user_id     unsigned int(F users.id)
        group_id    unsigned int(F groups.id)
    
    +---------+----------+
    | user_id | group_id |
    +---------+----------+
    |       1 |        1 |
    |       2 |        2 |
    | ....... | ........ |
    +---------+----------+
    

    【讨论】:

    • 谢谢。全局消息呢?
    • 我不太明白你的意思 - 因为全局消息会发送给所有用户,你只需选择 users 表中的所有用户并将消息发送给他们。我想如果你愿意,你可以创建一个group“全球”并在groups_alerts 表中输入全球消息的记录。
    • 我想避免为系统中使用的每个人创建那些链接记录 - 这就是我的意思。
    • @Dor - 您不必将它们链接到用户,只需将警报链接到 Global 组。而且我不确定您是否必须拥有一个 Global 组 - 这实际上取决于您如何设置应用程序。
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2012-12-04
    • 2014-10-11
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多