【问题标题】:How to store a list in a db column如何将列表存储在 db 列中
【发布时间】:2010-10-01 10:48:08
【问题描述】:

我想在数据库中存储一个对象 FOO。 假设 FOO 包含三个整数和一个“Fruits”列表。

列表可以有任意长度,我唯一知道的是所有允许的水果都存储在另一个表中。

我可以将水果列表存储在一个列中吗?

【问题讨论】:

    标签: sql database


    【解决方案1】:

    在规范化的关系数据库中,这种情况是不可接受的。您应该有一个联结表,为 FOO 对象的每个不同 ID 和 Fruit 的 ID 存储一行。这样一行的存在意味着水果在 FOO 的列表中。

    CREATE TABLE FOO ( 
      id int primary key not null,
      int1 int, 
      int2 int, 
      int3 int
    )
    
    CREATE TABLE Fruits (
      id int primary key not null,
      name varchar(30)
    )
    
    CREATE TABLE FOOFruits (
      FruitID int references Fruits (ID),
      FooID int references FOO(id),
      constraint pk_FooFruits primary key (FruitID, FooID)
    )
    

    要将 Apple 水果添加到 ID=5 的特定 FOO 对象列表中,您可以:

    INSERT FOOFruits(FooID, FruitID)
    SELECT 5, ID FROM Fruits WHERE name = 'Apple'
    

    【讨论】:

    • 谢谢。我一定会用这个方法。
    • 此模型为每个foo 实现了一组允许的水果。对我来说,列表的概念更强,包括排序:这个表不处理用户定义的水果的任意排序。实现它的最佳方法是什么。
    【解决方案2】:

    如果您非常确定自己在做什么(例如,您不需要查找列表的值),您还可以序列化您的对象,或者只是列表对象,然后存储它在二进制列中。

    仅对值进行字符分隔也可以,并且在保存和加载方面更便宜,但请注意您的数据不包含分隔符,或对其进行转义(并在加载时相应地处理转义等。 .. 不过,您选择的语言在这方面可能比您做得更好。;) )

    但是,要获得“正确”的解决方案,请执行上述 Mehrdad 描述的操作。

    【讨论】:

      【解决方案3】:

      它在技术上是可行的,但设计很糟糕,imo。

      您可以通过构建字符串并将其存储在 nvarchar(max) 字段中来实现(如果使用 sql server 或其等效项)。

      【讨论】:

      • +1 表示设计非常糟糕,但 -1 表示无论如何建议解决方案。网络:+0 来自我。
      【解决方案4】:

      您可以,但它可能会被视为文本,从而使在此列中的搜索变得困难且缓慢。您最好使用相关表。

      【讨论】:

        【解决方案5】:

        有些数据库允许将多个值存储在单行的单列中,但通常使用单独的表更方便。

        创建一个包含两列的表,一列包含指向对象表的主键的指针,另一列包含指向水果表的主键的指针。那么,如果一个对象有三个水果,那么 object_fruit 表中有三行都指向同一个对象,但指向三个不同的水果。

        【讨论】:

          【解决方案6】:
          INSERT FOOFruits (FooID, FruitID)
          SELECT 5, ID 
          FROM   Fruits 
          WHERE  name IN ('Apple', 'Orange');
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-05
            • 1970-01-01
            • 2020-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多