我正在使用包含消息传递功能的Phoenix Framework v1.1.0和Postgres v9.4构建应用程序。我不是指即时消息,而是指邮件类型的消息,其中用户可以创建消息并将其发送给一个或多个其他用户,而这些用户又可以回复。我对SQL数据库不太熟悉,而且更习惯使用Meteor进行MongoDB。在Postgres中对此类表进行建模的最有效方法是什么,以便将消息传递给一个或多个用户并对其进行响应?我原本打算创建一个收件人阵列,但我被困在那里,我确信有更好的方法。我的架构看起来像这样:
create table(:messages) do
add :from, :string
add :subject, :string
add :body, :text
add :to, :array, :string
timestamps
所以,我的问题是:
我应该使用什么模型来表示Postgres中的消息?
如何搜索数据库中的消息,以便立即通知用户收件箱中的消息并回复?
使用套接字(Phoenix中的频道)是否会使聊天类型的功能变得更容易?
答案 0 :(得分:1)
邮件处理的架构可能涉及many-to-many
和app_users
之间的messages
关系。这将利用Postgres数据库的关系特性。
在表users_messages
中,邮件的收件人至少会有一行。您可以在另一个字典表中添加DW,UDW等角色,并将有关收件人类型的信息放在此表中。
CREATE TABLE app_users ( -- one user is represented as one row here
id serial primary key,
...
);
CREATE TABLE messages ( -- one message is represented as one row here
id bigserial primary key,
id_sender int references app_users(id),
send_date timestamp default clock_timestamp(),
notify_date timestamp default null,
...
);
CREATE TABLE users_messages ( -- one message is represented as 1..* rows here
id bigserial primary key, -- I prefer to use sequences in every table, that's up to you
id_recipient int references app_users(id),
id_message bigint references messages(id),
is_read boolean,
...
);
我选择了DISTINCT
,因为您只想通知特定用户其收件箱中的新邮件,而不是他们的邮件。
查询以获取应收到有关其收件箱中未读邮件的收件人的信息,这一点很简单:
SELECT DISTINCT id_recipient
FROM users_messages
WHERE is_read is FALSE
如果您需要通知用户上次提取时的更改状态,您可以从messages
表中获取此信息,如下所示:
SELECT DISTINCT um.id_recipient
FROM messages m
LEFT JOIN users_messages um
WHERE m.notify_date is NULL
AND um.is_read is FALSE
并为所有提取的messages.notify_date
更新列messages.id
,这可以在SQL或框架中完成。这将需要另一个查询,留给读者作为练习。
但是,如果您只关心特定用户收到有关新邮件的通知,而不提醒他有一些未读邮件(实际上是电子邮件通知的工作方式),那么您可以获得那些通过运行:
SELECT DISTINCT um.id_recipient
FROM messages m
LEFT JOIN users_messages um
WHERE m.notify_date is NULL
答案 1 :(得分:0)
首先,抱歉,我对$ TZ=America/New_York date -R -d "now"; TZ=America/New_York date -R -d "now -330 min"
Sun, 27 Dec 2015 15:34:26 -0500
Sun, 27 Dec 2015 10:04:26 -0500
不是很熟悉,所以我会尽力回答你的问题。
这样:
phoenix
您可以运行如下查询:
CREATE TABLE message (
from_user text,
to_users text[],
cc_users text[],
body text
...
);