当您想要提醒用户一次(一次性注意新功能,即将发生的事件,特别优惠等)时,最好的方法是什么?
我主要关注的是数据表示,但是如果有更多问题要考虑,请指出它们.这是我第一次接近这个特殊问题.
所以到目前为止我的想法......
您可以拥有用户,消息和已查看/已确认的消息表.当用户确认消息时,我们在看到的表中有一个新条目,其中包含用户ID和消息ID对.
但是,看到的表将随着用户和消息的数量而迅速增长.在某些时候,这将变得笨拙(任何洞察力,那将是单个服务器上的单个mysql数据库?).
为每个消息创建1个看到的表并且可能最终会有20-30个这样的附加表开始会更好吗?不是真的有问题.它只是伴随着每次有新消息时必须创建一个新表的麻烦(当然,这将在代码中自动化 - 仍然需要更多编码).
这是一个目前拥有2-3K用户的项目,但希望明年能够将这一目标增加到10K,当然,我们也在寻求超越这一目标......
编辑:我对目前最受欢迎的投票方法并不热衷.该提案似乎是预先填充消息表并删除消息.这似乎是更多的工作.您不仅需要在每次添加新邮件时添加整个用户列表.每次添加新用户时,您还必须为新用户添加所有消息 - 单独的逻辑.
最重要的是,"看到"消息的记录实际上是没有记录.这似乎不对.此外,如果您以后决定使用简单的时间戳跟踪何时看到消息.您必须重写大量代码,其他代码变得无法使用.
最后,有人可以告诉我为什么将新表添加到数据库是如此绝对可怕?这是否会在添加新功能时始终发生?以任何CMS:Joomla或Wordpress为例.添加新插件时,您将动态创建表.所以它必须比"不要做" 更加细致入微和语境.什么是陷阱,你不做的情况是什么,或者可以做什么?
我可以看到你可能会说:在生产服务器上创建新表时要小心.确保它已经过充分测试,但最终,你只是添加一个空表.
这可能需要和延长答案,所以如果有任何知道任何文章,请发布.
编辑: Gabriel Sosa给出了他的消息表的一个很好的刷新示例,我将创建一个类似于我最初发布的看到的表,尽管也有时间戳列.谢谢!
您可以在表中列出看不见的消息,并在显示消息后从表中删除该行.您也可以在X周后删除行,也许是用户是否看到这些消息.这将使桌子不受限制地增长.我想像这样的表:
messages -------- type PRIMARY KEY text TEXT unseenMessages -------------- id PRIMARY KEY messageType FOREIGN KEY user FOREIGN KEY expirationDate DATE
此unseenMessages
表将保存系统中的所有消息,每个用户每个消息一次.当用户加载页面时,您检查它是否在此表中有任何条目.如果是这样,您显示这些消息,然后从表中删除它们.可以把它想象成一个消息"收件箱".
此外,我不会做任何涉及动态表创建的事情.你永远不应该*动态创建表格.永远.
*当然,除临时表外.
您的所有消息都应存储在一个表中,或至少存储在固定数量的预定义表中.在运行中创建表是一个重要的数据库罪.即时添加和删除列也是如此.您只是不动态更改数据库架构.你不要在礼貌的社会中这样做.如果您认为必须,则没有正确设计数据库.
编程模拟是eval()
功能:它只是其中一个几乎从来不是一个好主意的东西.平心而论,eval()
在某些情况下还可以.动态创建表永远不会.
您的卷对于现代RDBMS而言并不令人生畏.请记住,Twitter的MySQL数据库和其他SQL Server和Oracle数据库中有100多万条记录.
我可以看到两种方法来实际解决这个问题
为特定消息设置一个独特的cookie,如果这些消息很罕见,那就很好
创建几个表来保存消息详细信息
消息 - 将保留消息定义,包括消息文本(或您的情况下的HTML?),以及活动/非活动的消息状态.
用户消息 - 交叉引用表,如果用户查看了消息,则包含一行.当用户看到并确认消息时,您可以在此表中插入一行.
要确定用户是否应该看到该消息,您可以使用用户的ID查询此表和活动消息.如果返回结果,则应绕过该消息,否则显示它.
我认为这为您提供了扩展到未来的机会,因为"用户消息"表只是用户/帐户表和消息表之间的整数关联键.您还可以在用户消息表上记录用户的处置(确认,查看,绕过等...)
如果不清楚,请告诉我,我可以尝试更好地解释或提供图表.我确信还有其他一些模式可以做到这一点.每个月左右登录我的在线帐户后,美国银行会闪现这些东西.