我(理论上)可以在关系数据库模式中使用Collection(例如,Array,List)作为外键吗?

时间:2010-08-18 08:17:49

标签: sql database-design relational-database

是否可以使用诸如Multiset或Array之类的Collection作为数据库方案中的外键?

背景:学生建议使用这样的构造(不要将连接表用于n:m关联)将以下对象结构存储在数据库中

public class Person {
    String name;
    List<Resource> res;
    …
}

public class Resource {
    int id;
    List<Person> prs;
    …
} 

SQL:2003

4 个答案:

答案 0 :(得分:2)

恕我直言,学生不理解关系概念。我不知道今天的数据库中如何实现集合类型,但它们很可能将它们存储在单独的表中。

修改 如果技术上可行,我怀疑它会有用。考虑查询语言。 Sql是为关系结构而设计的,我怀疑你是否真的可以使用集合类型具有相同的灵活性和可能性。如果你有它,你就再也看不懂了。考虑索引。等等。

关系结构是原始的,但非常强大和快速。你可以(几乎)用它们做任何事情。实际上不需要集合类型,尽管它们在某些情况下可能有用。使用集合(用于关系的东西)会更复杂,更不纯粹。

答案 1 :(得分:2)

正如大卫所指出的,理论允许属性值属于集合类型。

但是,在您的情况下,这只是为了模拟n:m关系(我是否正确),它根本不适用。

如果Person P1具有关联的资源R1和R2,则此人的行将类似于{P1,{R1,R2}}。如果该集合类型列是引用其他表的外键,则意味着必须存在另一个表,其中一行中出现了一行,其中集合值为{R1,R2}。你的例子中会有哪个表格?

如果您需要处理空集合和非空集合,那么集合类型属性最有用。世界上没有任何关系联盟会为你做同等的事情。

答案 2 :(得分:1)

简单地说,我会说不。我不认为它在SQL2003中是可能的,并且在任何情况下它都会过于密切地耦合代码和数据库结构。记住构造代码的良好实践,以便更改数据库不需要更改代码,反之亦然。

正如Stefan所说,你需要为Resource和Person提供单独的表,并指向它们之间的索引。

因此,根据显示的类,每个表都需要3个颜色。

然后,您将通过对数据库使用适当的查询来获取您的类数据。

答案 3 :(得分:0)

原则上,是的,你可以实现这样的参考约束。这是假设您的RDBMS允许值集的合适类型。例如,如果支持关系值属性(RVA),它可以是关系值。

如果它是RVA,那么约束可以很容易地用关系代数/微积分或它的等价物来表达。例如,你可以在像Rel这样支持Tutorial D语言的RDBMS中完成它。在SQL中执行它可能会更加困难 - 但是SQL不是真正的关系语言。

当然,你可以通过关系来做这件事并不一定能让它成为一个好主意......