【问题标题】:What is the best way to fake a SQL array or list?伪造 SQL 数组或列表的最佳方法是什么?
【发布时间】:2012-03-09 18:48:08
【问题描述】:

我正在构建一个聊天室应用程序,我想跟踪当前在聊天室中的用户。但是,我不能只将这个用户数组(或者列表会更好)存储在 Chatroom 表中我的一条记录的字段中。

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

好像有3个选项:


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

2:由于允许的最大用户数为 10,因此在每个聊天室记录上只需要 10 个额外的字段,代表当前在那里的用户

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


我不知道,哪个是最好的?我也愿意接受其他选择。我也在使用 Rails,这在这里似乎无关紧要,但可能会引起人们的兴趣。

【问题讨论】:

    标签: sql ruby-on-rails arrays list


    【解决方案1】:

    选项 3 是最好的。这就是你在关系模式中的做法。它也是最灵活和面向未来的选择。

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

    【讨论】:

    • 而在分隔列表中存储数据通常会在您想要查询列表中的任何单个项目的那一刻变成一场噩梦,例如查询特定用户现在所在的聊天室。
    • @Konerak 谢谢。我对这种方法的唯一担心是当我必须获取这些记录时......考虑到会有很多聊天室,用户聊天的数量将是大约 10 倍,这表明查找成本很高
    • @varatis,这是有道理的担忧,但如果您的表被正确索引,选项 3 仍将获得最佳解决方案(性能和灵活性)。如果您担心它会快速增长,请确保有一个良好的清除/存档过程。
    • @varatis:像这样获取仍然会更快。想象一下,当您使用逗号分隔值并且用户断开连接时。您必须为用户检查每个单独的聊天室...
    • 我赞成这个答案。我要补充一点,这确实应该出现在常见问题解答中。关于在列中创建 CSV 列表与创建相关子表的问题已被问过数十次。到目前为止,我们应该能够为提问者提供令人信服的证据,证明解析列的性能提升是一种幻觉,而编程的噩梦是真实的。
    【解决方案2】:

    执行此操作的正确方法是添加一个额外的表,表示用户在聊天室中的实例。在大多数情况下,这可能是您想要做的,因为它使您可以更灵活地进行查询类型(例如:列出特定用户所在的所有聊天室,查找每个聊天室中的平均人数等)您只需要添加一个新表 - 类似于 chat_room_userschat_room_iduser_id

    如果您不希望添加额外的表,那么 Rails(或更具体地说是 ActiveRecord)确实具有一些功能,可以在 SQL 列中存储诸如数组之类的数据结构。只需在 Rails 迁移中将您的列设置为 stringtext 类型,然后添加:

    serialize :users 
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多