是否可以使用诸如Multiset或Array之类的Collection作为数据库方案中的外键?
背景:学生建议使用这样的构造(不要将连接表用于n:m关联)将以下对象结构存储在数据库中
public class Person {
String name;
List<Resource> res;
…
}
public class Resource {
int id;
List<Person> prs;
…
}
SQL:2003
答案 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不是真正的关系语言。
当然,你可以通过关系来做这件事并不一定能让它成为一个好主意......