我正在构建一个聊天室应用程序,我想跟踪哪些用户当前在聊天室中。但是,我不能只在Chatroom表中的一个记录中的字段中存储这个用户数组(或者列表会更好)。
显然,其中一种SQL数据类型不是数组,这导致我遇到这个问题:在SQL数据库中伪造/模拟数组功能的最佳方法是什么?
似乎有3种选择:
1:将用户列表/数组存储为逗号分隔的字符串,当我想将其恢复为数组时,只需进行一些解析
2:由于允许的最大用户数为10,因此每个聊天室记录中只有10个额外字段,代表当前在那里的用户
3:有一个新表Userchats,它有两个字段,一个对聊天室的引用和一个用户名
我不知道哪个最好?我也对其他选择持开放态度。我也在使用Rails,这似乎与此无关,但可能会引起人们的兴趣。
答案 0 :(得分:4)
选项3是最好的。这就是你在关系模式中的做法。它也是最灵活,面向未来的选择。
它可以在宽度上变得更容易(额外的列说,加入的日期,通道状态,上次谈话的时间戳)和长度(当您决定现在可以在一个房间中有15个用户而不是10个时,额外的行)。 / p>
答案 1 :(得分:0)
正确的方法是添加一个额外的表来表示聊天室中用户的实例。在大多数情况下,这可能是您想要做的,因为它为您提供了更多的查询类型(例如:列出特定用户所在的所有聊天室,查找每个聊天室中的平均人数)等等。你只需要添加一个新表 - 例如chat_room_users
,chat_room_id
和user_id
。
如果你没有添加额外的表,那么Rails(或更具体地说是ActiveRecord)确实具有一些功能来存储SQL列中的数组结构。只需在Rails迁移中将列设置为string
或text
类型,然后添加:
serialize :users
然后,您可以将此列用作普通的Ruby数组/对象,ActiveRecord将在您使用它时自动序列化/反序列化此对象。请记住,这种方法存在很多权衡 - 您永远无法使用SQL查询特定房间中的用户,而是需要在使用之前将所有数据下载到Ruby。