每当我将媒体上传到我的网站时,会发生什么?每个人都会收到通知。每个人都可以单击一个框进行删除,它将永远从他们的msg队列中消失。
如果我的网站上有10,000个人,我会如何将它添加到每个人的msg队列中?我可以想象它需要花费很多时间,所以我会选择类似文件系统期刊的东西吗?标记我需要通知人,数据然后我当前的位置。然后每100次插入更新我的位置?我需要在我的观察者名单上有一个PK,所以如果有人在中间登记,我的订单将不会被打破,因为我将通过PK进行排序?
这是群发通知系统的最佳解决方案吗?
-edit -
此网站是用户创建的内容网站。管理员可以发送全球消息,受欢迎的人可能有数千名订阅者。
答案 0 :(得分:3)
如果10000插入一个狭窄的多对多表中,将收件人链接到消息(recipientid, messageid, status)
的速度很慢,我预计您的设计会遇到更大的问题。
这种操作我通常不会担心在后期操作过程中批处理或订阅人员 - 基本上:
假设@publisherid
已知,SQL Server上已知@msg
:
BEGIN TRANSACTION
INSERT INTO msgs (publisherid, msg)
VALUES(@publisherid, @msg)
SET @messageid = SCOPE_IDENTITY()
INSERT INTO msqqueue (recipientid, messageid, status)
SELECT subscriberid, @messageid, 0 -- unread
FROM subscribers
WHERE subscribers.publisherid = @publisherid
COMMIT TRANSACTION
答案 1 :(得分:1)
也许只是为每个用户记录他们看过的通知 - 因此向用户显示的通知集是在他们的“最早_通知”范围之前(当他们注册时,或者一周前...)减去那些通知之前创建的通知他们已经承认了。这样你就可以延迟插入任何东西,直到它同时是一个用户 - 如果你只向用户显示不到一周的消息,你可以清除一周或更长时间的read-this-notification标志。
(在我的旧工作中,我的DBA的性能优化提示:“业务流程是最容易改变的事情,首先看一下它们”)
答案 2 :(得分:1)
我要说的是让数据库处理它能够做到并且设计好的事情。插入和管理数据。不要尝试在代码中执行此操作,只需编写SQL即可一次性插入数据。 10000行是所有真实数据库的牺牲品。
答案 3 :(得分:0)
恕我直言,插入记录可能不是解决此问题的最有效方法。您是否可以使用客户端cookie来存储用户是否删除了通知,或者即使他们清除了Cookie,您是否也必须跟踪它?如果您上传新视频,应用只能将Cookie与新视频记录ID进行比较,并决定根据存储在Cookie中的内容显示或隐藏通知。这样可以节省大量的数据库插入,并且可以最大限度地保留客户端。
答案 4 :(得分:0)
如果你正在使用Postgres,你可以使用COPY命令,这是所有这些中最快的方法:
COPY tablename (col1, col2, col3) FROM '/path/to/tabfile';
其中 tabfile 是一个包含大量条目的TAB分隔文件。但是,如果存在一些UNIQUE约束,则会失败,并且文件中存在重复项。