如何在db列中存储列表

时间:2009-01-14 19:04:50

标签: sql database

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

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

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

6 个答案:

答案 0 :(得分:85)

在规范化的关系数据库中,这种情况是不可接受的。您应该有一个联结表,为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'

答案 1 :(得分:4)

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

只是字符分隔值也可以很好,并且在保存和加载方面更便宜,但要小心你的数据不包含分隔符,或者将其转义(并在加载时相应地处理转义等)。 ..你选择的语言可能比你做得更好。;))

但是,对于“正确”的解决方案,请按照上面描述的Mehrdad进行操作。

答案 2 :(得分:3)

技术上可行,但设计非常差,imo。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

你可以,但它可能会被视为文本,使得在此专栏中搜索变得困难和缓慢。你最好使用相关的表格。

答案 5 :(得分:-1)

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