如何在db列中存储列表

Nif*_*fle 53 sql database

我想将对象FOO存储在数据库中.让我们说FOO包含三个整数和一个" 水果 " 列表.

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

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

Meh*_*ari 88

在规范化的关系数据库中,这种情况是不可接受的.您应该有一个联结表,为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)
)
Run Code Online (Sandbox Code Playgroud)

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

INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'
Run Code Online (Sandbox Code Playgroud)

  • 该模型为每个 `foo` 实现了一组允许的水果。对我来说,列表的概念更强,包括排序:该表不处理用户定义的水果的任意排序。实现它的最佳方法是什么。 (5认同)
  • 谢谢。我一定会使用这种方法。 (2认同)

E.J*_*nan 5

在我看来,它在技术上是可行的,但设计非常糟糕。

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

  • +1 表示设计非常糟糕,但 -1 表示提出解决方案。净:我的+0。 (3认同)
  • 谁关心你的信用@BillKarwin (2认同)

AKX*_*AKX 5

如果您完全确定自己在做什么(例如,您不需要查找列表的值),则还可以序列化您的对象或仅序列对象,并将其存储在二进制文件中柱。

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

但是,对于“适当的”解决方案,请执行上述Mehrdad的操作。