【发布时间】:2010-10-01 10:48:08
【问题描述】:
我想在数据库中存储一个对象 FOO。 假设 FOO 包含三个整数和一个“Fruits”列表。
列表可以有任意长度,我唯一知道的是所有允许的水果都存储在另一个表中。
我可以将水果列表存储在一个列中吗?
【问题讨论】:
我想在数据库中存储一个对象 FOO。 假设 FOO 包含三个整数和一个“Fruits”列表。
列表可以有任意长度,我唯一知道的是所有允许的水果都存储在另一个表中。
我可以将水果列表存储在一个列中吗?
【问题讨论】:
在规范化的关系数据库中,这种情况是不可接受的。您应该有一个联结表,为 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 实现了一组允许的水果。对我来说,列表的概念更强,包括排序:这个表不处理用户定义的水果的任意排序。实现它的最佳方法是什么。
如果您非常确定自己在做什么(例如,您不需要查找列表的值),您还可以序列化您的对象,或者只是列表对象,然后存储它在二进制列中。
仅对值进行字符分隔也可以,并且在保存和加载方面更便宜,但请注意您的数据不包含分隔符,或对其进行转义(并在加载时相应地处理转义等。 .. 不过,您选择的语言在这方面可能比您做得更好。;) )
但是,要获得“正确”的解决方案,请执行上述 Mehrdad 描述的操作。
【讨论】:
它在技术上是可行的,但设计很糟糕,imo。
您可以通过构建字符串并将其存储在 nvarchar(max) 字段中来实现(如果使用 sql server 或其等效项)。
【讨论】:
您可以,但它可能会被视为文本,从而使在此列中的搜索变得困难且缓慢。您最好使用相关表。
【讨论】:
有些数据库允许将多个值存储在单行的单列中,但通常使用单独的表更方便。
创建一个包含两列的表,一列包含指向对象表的主键的指针,另一列包含指向水果表的主键的指针。那么,如果一个对象有三个水果,那么 object_fruit 表中有三行都指向同一个对象,但指向三个不同的水果。
【讨论】:
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID
FROM Fruits
WHERE name IN ('Apple', 'Orange');
【讨论】: