dco*_*bus 11 mysql database-design database-schema
好吧,所以我觉得我很接近拥有我需要的东西,但我不确定几件事情:
TABLE messages
message_id
message_type
sender_id
timestamp
TABLE message_type
message_type_code (1, 2, 3)
name (global, company, personal)
TABLE message_to_user
message_id
receiver_id
status (read/unread)
Run Code Online (Sandbox Code Playgroud)
目标:
问题:
如果您觉得它会有所帮助,请随意添加到我的架构中.
Kev*_*son 10
架构看起来会起作用.应该也应该有一个创建日期.虽然没有为每个人创建条目,但无法知道您是否已阅读全局消息.
这是一些SQL:
SELECT M.*, MTU.*
FROM messages M
LEFT JOIN message_to_user MTU ON MTU.message_id=M.message_id
WHERE MTU.receiver_id={$UserID} OR M.message_type={$GlobalType}
ORDER BY M.created_on DESC
Run Code Online (Sandbox Code Playgroud)
[编辑]问题:每个用户都需要为全球电子邮件拥有自己独特的"读取"状态.您可能还希望让他们能够"删除"/隐藏此电子邮件,这样他们就不必一直看着它.如果没有为每封电子邮件创建任何一行,就没有办法解决这个问题,这可能会让很多人立刻做出这样的行动......或者更好的是,在阅读之前不要创建状态.这样,全局电子邮件的INSERTS将仅在读取消息时发生.
messages
message_id
message_type
sender_id
timestamp
message_recipient
message_id
user_id
message_status
message_status_id
message_id
user_id
is_read
read_datetime
is_deleted
deleted_datetime
SELECT M.*, MR.*, MS.*
FROM messages M
LEFT JOIN message_recipient MR ON MR.message_id=M.message_id
LEFT JOIN message_status MS ON MS.message_id=M.message_id
WHERE
(MS.message_status_id IS NULL OR MS.is_deleted = 0)
(MR.user_id={$UserId} OR M.message_type={$GlobalType})
ORDER BY M.timestamp DESC
Run Code Online (Sandbox Code Playgroud)
[编辑]是否将message_type用作数据库表或仅仅作为代码中的设置部分是个人偏好,部分是您的需求.如果需要查询数据库并直接从查询中查看"个人"和"全局"文本,则需要使用message_type表.但是,如果您只需要"类型"来处理业务逻辑,但不需要在查询结果中看到它,那么我将使用"Enum"样式方法.枚举是一个C#的东西...在PHP中,你得到的最接近的是一个带有常量的类......类似于:
class MessageTypes {
public const Global = 0;
public const Personal = 1;
}
Run Code Online (Sandbox Code Playgroud)
那么,您的查询将是: WHERE ... message_type=".MessageTypes::Global."...
一种方法可以是将全局消息与个人消息分开,就像我认为你已经尝试过的那样.
要有效地获取全局消息的读取状态,您需要添加一个表,其中包含一起包含global_message_id和user_id的组合键.
messages_tbl
- message_id | int(11) | Primary Key / Auto_Increment
- message_type | int(11)
- sender_id | int(11) | FK to sender
- receiver_id | int(11) | FK to receiver
- status | int(1) | 0/1 for Unread / Read
- message | text
- date | datetime
global_message_tbl
- g_message_id | int(11) | Primary Key / Auto_Increment
- g_message_type | int(11)
- sender_id | int(11) | FK to sender
- date | datetime
global_readstatus_tbl
- user_id | int(11) | Primary Key
- g_message_id | int(11) | Primary Key
- date | datetime
Run Code Online (Sandbox Code Playgroud)
或者合并messages_tbl,global_message_tbl以便他们每个用户在循环中亲自发送一个全局消息.这会将您的架构减少到一个表.
messages_tbl
- message_id | int(11) | Primary Key / Auto_Increment
- sender_id | int(11) | FK to sender
- receiver_id | int(11) | FK to receiver
- status | int(1) | 0/1 for Unread / Read
- message_type | varchar(8) | Personal / Global / Company
- message | text
- date | datetime
- type | varchar(8)
Run Code Online (Sandbox Code Playgroud)
如果你希望能够更好地规范化你的表,并且将来更容易添加消息类型,请将message_type再次移回其自己的表中,并制作message_type一个FKmessage_type_id
message_type_tbl
- message_type_id | int(11) | Primary Key / Auto_Increment
- message_type | varchar(8) | Personal / Global / Company
Run Code Online (Sandbox Code Playgroud)
更新 - 样本表(1表)
message_tbl
message_id | message_type | sender_id | receiver_id | status | message | datetime
1 | personal | 2 | 3 | read | foobar | 12/04/11 00:09:00
2 | personal | 2 | 4 | unread | foobar | 12/04/11 00:09:00
3 | personal | 3 | 2 | unread | barfoo | 12/04/11 02:05:00
4 | global | 1 | 2 | unread | gmessage | 13/04/11 17:05:00
5 | global | 1 | 3 | unread | gmessage | 13/04/11 17:05:00
6 | global | 1 | 4 | read | gmessage | 13/04/11 17:05:00
Run Code Online (Sandbox Code Playgroud)
user_tbl
user_id | name
1 | Admin
2 | johnsmith
3 | mjordan
4 | spippen
Run Code Online (Sandbox Code Playgroud)
以上假设用户2,3和4是一般用户向对方发送消息,用户1是将用于发送全局消息的管理员帐户(直接分发给每个用户),允许您查看相同的信息,就像它一样是个人信息.
要以这种格式发送全局消息,您只需循环遍历users表,以获取要将全局消息发送到的所有ID,然后只是INSERT每个用户的行messages_tbl.
如果您不希望您的用户每天向数百万用户发送数百万条消息以及定期发送全局消息,则行数不应成为问题.您始终可以通过创建清理脚本来清除用户的旧读取消息.
| 归档时间: |
|
| 查看次数: |
12816 次 |
| 最近记录: |