- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
如果您想一次性提醒用户某事(一次关于新功能、即将举行的事件、特别优惠等),最好的方法是什么?
我主要关心数据表示,但如果有更多问题需要考虑,请指出。这是我第一次处理这个特殊问题。
所以到目前为止我的想法......
您可以有一个用户、一条消息和一个已查看/已确认的消息表。当用户确认消息时,我们在看到的表中有一个新条目,其中包含用户 ID 和消息 ID 对。
但是seen表会随着用户数和消息数的增加而快速增长。在某些时候,这将变得笨拙(任何洞察力何时适用于单个服务器上的单个 mysql 数据库?)。
是否只为每条消息创建 1 个可见表并可能以 20-30 个这样的附加表开始?不是真正的问题。它只是带来了额外的麻烦,即每次有新消息时都必须创建一个新表(当然,这将在代码中自动完成 - 仍然需要更多编码)。
这是针对当前拥有 2-3K 用户的项目,但希望在明年将其增加到 10K,当然,我们也在考虑超越这一点......
编辑:我对目前投票最高的方法一点都不热心。 该提案似乎是预填充消息表并删除看到的消息。这似乎是更多的工作。每次添加新消息时,您不仅必须添加整个用户列表。每次添加新用户时,您还必须为新用户添加所有消息 - 单独的逻辑。
最重要的是,消息被“看到”的记录实际上是没有记录。这似乎不对。另外,如果您以后决定使用简单的时间戳来跟踪何时看到消息。您必须重写大量代码,而其他代码变得无法使用。
最后,有人能告诉我为什么向数据库中添加新表如此可怕吗?添加新功能时,这种情况不会一直发生吗?以任何 CMS 为例:Joomla 或 Wordpress。添加新插件时,您是在动态创建表。因此,它必须比“不要做”更细致入微、更符合情境。有哪些陷阱,在什么情况下你不做或者可以做?
我知道您可能会说:在生产服务器上创建新表时要小心。确保它已经过良好测试,但最终,您只是添加了一个空表。
这可能需要和扩展答案,所以如果有人知道任何文章,请发布。
编辑:加布里埃尔·索萨 (Gabriel Sosa) 给出了一个很好的消息表示例,我将简单地创建一个与我最初发布的表类似的已见表,尽管也有时间戳列。谢谢!
最佳答案
您可以将未看到的消息列在一个表中,一旦显示该消息,您就可以从表中删除该行。您还可以在 X 周后删除行,也许,无论用户是否看到这些消息。这将防止表格无限增长。我在想象这样的表格:
messages--------type PRIMARY KEYtext TEXTunseenMessages--------------id PRIMARY KEYmessageType FOREIGN KEYuser FOREIGN KEYexpirationDate DATE
此unseenMessages
表将保存您系统中的所有消息,每个用户每条消息一次。当用户加载页面时,您检查他们是否在此表中有任何条目。如果是这样,您将显示这些消息,然后将它们从表中删除。将其视为消息“收件箱”。
此外,我不会做任何涉及动态表创建的事情。你永远不应该* 即时创建表格。曾经。
* 当然,临时表除外。
您的所有消息都应存储在一个 表中,或者至少存储在固定数量的预定义表中。即时创建表是数据库的大忌。动态添加和删除列也是如此。您只是不要动态更改数据库模式。在礼貌的社会你不会那样做。如果您认为必须这样做,则说明您没有正确设计数据库。
编程模拟是 eval()
函数:它只是那些几乎从来都不是好主意的东西之一。平心而论,eval()
在某些情况下是可以的。动态创建表格从来都不是。
关于mysql - 如何在 Web 应用程序中实现一次性(每个用户)消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1072019/
我是一名优秀的程序员,十分优秀!