伪造SQL数组或列表的最佳方法是什么?

伪造SQL数组或列表的最佳方法是什么?,sql,ruby-on-rails,arrays,list,Sql,Ruby On Rails,Arrays,List,我正在构建一个聊天室应用程序,我希望跟踪哪些用户当前在聊天室中。然而,我不能仅仅将这个用户数组(或者最好是一个列表)存储在聊天室表中我的一个记录的字段中 显然,其中一种SQL数据类型不是数组,这就引出了这个问题:在SQL数据库中伪造/模拟数组功能的最佳方法是什么 似乎有3种选择: 1:将用户列表/数组存储为逗号分隔的字符串,当我想将其返回数组时,只需进行一些解析即可 2:因为最大用户数量允许为10,所以在每个聊天室记录上只需额外添加10个字段,代表当前在聊天室的用户 3:有一个新的表Userch

我正在构建一个聊天室应用程序,我希望跟踪哪些用户当前在聊天室中。然而,我不能仅仅将这个用户数组(或者最好是一个列表)存储在聊天室表中我的一个记录的字段中

显然,其中一种SQL数据类型不是数组,这就引出了这个问题:在SQL数据库中伪造/模拟数组功能的最佳方法是什么

似乎有3种选择:


1:将用户列表/数组存储为逗号分隔的字符串,当我想将其返回数组时,只需进行一些解析即可

2:因为最大用户数量允许为10,所以在每个聊天室记录上只需额外添加10个字段,代表当前在聊天室的用户

3:有一个新的表Userchats,它有两个字段,一个对聊天室的引用和一个用户名



我不知道,哪一个最好?我也有其他选择。我也在使用Rails,这在这里似乎无关紧要,但可能很有趣。

选项3是最好的。这就是在关系模式中执行此操作的方式。它也是最灵活、最经得起未来考验的选择


它的宽度(额外的列,例如,加入的日期、频道状态、上次通话的时间戳)和长度(如果您现在决定房间中可以有15个用户,而不是10个用户,则会增加额外的行数)会变得更容易。

选项3是最好的。这就是在关系模式中执行此操作的方式。它也是最灵活、最经得起未来考验的选择

它可以在宽度(额外的列,例如,加入的日期、频道状态、上次交谈的时间戳)和长度(当您决定一个聊天室中可以有15个用户而不是10个用户时,可以增加额外的行)方面变得更容易。

正确的方法是添加一个额外的表,表示聊天室中用户的实例。在大多数情况下,这可能是您想要做的,因为它为您提供了更多查询类型的灵活性(例如:列出某个特定用户所在的所有聊天室,查找每个聊天室中的平均人数,等等)。您只需添加一个新表,例如
聊天室用户
,具有
聊天室id
,以及
用户id

如果您不想添加额外的表,那么Rails(或者更具体地说是ActiveRecord)确实有一些功能来存储数据结构,比如SQL列中的数组。只需在Rails迁移中将列设置为
字符串
文本
类型,然后添加:

serialize :users 
然后,您可以将该列用作普通的Ruby数组/对象,ActiveRecord将在您使用该对象时自动序列化/反序列化该对象。请记住,这种方法有很多折衷之处-您永远无法使用SQL查询特定房间中的用户,而是需要在使用Ruby之前将所有数据向下拉到Ruby中。

正确的方法是添加一个额外的表,表示聊天室中的用户实例。在大多数情况下,这可能是您想要做的,因为它为您提供了更多查询类型的灵活性(例如:列出某个特定用户所在的所有聊天室,查找每个聊天室中的平均人数,等等)。您只需添加一个新表,例如
聊天室用户
,具有
聊天室id
,以及
用户id

如果您不想添加额外的表,那么Rails(或者更具体地说是ActiveRecord)确实有一些功能来存储数据结构,比如SQL列中的数组。只需在Rails迁移中将列设置为
字符串
文本
类型,然后添加:

serialize :users 

然后,您可以将该列用作普通的Ruby数组/对象,ActiveRecord将在您使用该对象时自动序列化/反序列化该对象。请记住,这种方法有很多折衷之处——您永远无法使用SQL查询特定房间中的用户,而是需要在使用Ruby之前将所有数据向下拉到Ruby中。

并且在分隔列表中存储数据通常会在您想要查询房间中的任何单个项目时变成一场噩梦列表(如查询)可查看特定用户当前所在的聊天室。@Konerak谢谢。我唯一关心的是当我必须获取这些记录时。。。考虑到将会有很多聊天室,将会有大约10倍的用户聊天,这意味着一个昂贵的价格find@varatis,这是一个值得关注的问题,但如果表索引正确,选项3仍然是最佳解决方案(性能和灵活性)。如果您担心清除/归档过程会增长得很快,请确保它有一个良好的清除/归档过程。@varatis:这样的获取速度会更快。想象一下,当您使用逗号分隔的值时,用户断开了连接。你必须检查每个聊天室的用户…我对这个答案投了赞成票。我要补充的是,这真的应该出现在常见问题解答中。关于在列中创建CSV列表与创建相关子表的问题已经被问了几十次。到目前为止,我们应该能够向提问者提供令人信服的证据,证明解析列的性能提升是一种融合,编程噩梦是真实存在的。如果您想查询列表中的任何单个项目,例如查询某个特定用户当前所在的聊天室,则将数据存储在分隔列表中通常会变成噩梦。@Konerak,谢谢。我唯一关心的是当我必须获取这些记录时。。。考虑到将会有很多聊天室,将会有大约10倍的用户聊天,这意味着一个昂贵的价格find@varatis,这是一个值得关注的问题,但如果表索引正确,选项3仍然是最佳解决方案(性能和灵活性)。如果您担心清除/归档过程会增长得很快,请确保它有一个良好的清除/归档过程。@varatis:获取速度会更快