Sql 如何在db列中存储列表

Sql 如何在db列中存储列表,sql,database,Sql,Database,我想在数据库中存储对象FOO。 假设FOO包含三个整数和一个“水果”列表 列表可以有任何长度,我只知道所有允许的水果都存储在另一个表中 我可以把水果清单储存在一列中吗 在规范化关系数据库中,这种情况是不可接受的。您应该有一个连接表,它为FOO对象的每个不同ID和水果的ID存储一行。这样一行的存在意味着水果在食物的列表中 CREATE TABLE FOO ( id int primary key not null, int1 int, int2 int, int3 int )

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

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


我可以把水果清单储存在一列中吗

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

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 fruit添加到ID=5的特定FOO对象列表中,您需要:

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

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


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

可以,但它可能会被视为文本,这使得在该列中进行搜索既困难又缓慢。你最好使用一个相关的表格。

这在技术上是可能的,但在设计上会非常糟糕,依我看


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

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

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


但是,要获得“适当”的解决方案,请按照Mehrdad的上述说明进行操作。

谢谢。我将明确使用此方法。此模型为每个
foo
实现一组允许的结果。对我来说,列表的概念更强大,包括排序:这个表不处理用户定义的水果的任意排序。实现它的最佳方法是什么。+1表示设计非常糟糕,但-1表示建议解决方案。网络:+0来自我。
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID 
FROM   Fruits 
WHERE  name IN ('Apple', 'Orange');