Sql 我(理论上)可以在关系数据库模式中将集合(如数组、列表)用作外键吗?

Sql 我(理论上)可以在关系数据库模式中将集合(如数组、列表)用作外键吗?,sql,database-design,relational-database,Sql,Database Design,Relational Database,是否可以在数据库方案中使用集合(如Multiset或数组)作为外键 背景:一名学生建议使用这样的构造(不要为n:m关联使用联接表)在数据库中存储以下对象结构 public class Person { String name; List<Resource> res; … } public class Resource { int id; List<Person> prs; … } 公共类人物{ 字符串名; 列表资源;

是否可以在数据库方案中使用集合(如Multiset或数组)作为外键

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

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

public class Resource {
    int id;
    List<Person> prs;
    …
} 
公共类人物{
字符串名;
列表资源;
…
}
公共类资源{
int-id;
减贫战略清单;
…
} 

SQL:2003

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

编辑 如果技术上可行,我怀疑它是否有用。考虑查询语言。Sql是为关系结构设计的,我怀疑使用集合类型是否真的有同样的灵活性和可能性。如果你有它,你就不能再读了。考虑指标。等等等等


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

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

编辑 如果技术上可行,我怀疑它是否有用。考虑查询语言。Sql是为关系结构设计的,我怀疑使用集合类型是否真的有同样的灵活性和可能性。如果你有它,你就不能再读了。考虑指标。等等等等


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

简单地说,我会说不。我认为在SQL2003中不可能,而且在任何情况下,它都会将代码和数据库结构紧密地结合在一起。请记住构造代码的良好实践,这样对数据库的更改就不需要对代码进行更改,反之亦然

正如Stefan所说,您需要为Resource和Person提供单独的表,其中包含指向它们之间索引的外键链接

因此,根据显示的类,每个表需要3个列


然后,您可以通过对数据库进行适当的查询来获取类数据。

简单地说,我会说不。我认为在SQL2003中这是不可能的,而且在任何情况下,它都会将代码和数据库结构紧密地结合在一起。请记住构造代码的良好实践,这样对数据库的更改就不需要对代码进行更改,反之亦然

正如Stefan所说,您需要为Resource和Person提供单独的表,其中包含指向它们之间索引的外键链接

因此,根据显示的类,每个表需要3个列


然后,您可以通过对数据库进行适当的查询来获取类数据。

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

如果是RVA,那么约束可以很容易地用关系代数/微积分或其等价物表示。例如,您可以在支持教程D语言的RDBMS(如Rel)中执行此操作。在SQL中实现这一点可能要困难得多,但SQL并不是真正的关系语言


当然,事实上,你可以相对地做这件事并不一定是个好主意……

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

如果是RVA,那么约束可以很容易地用关系代数/微积分或其等价物表示。例如,您可以在支持教程D语言的RDBMS(如Rel)中执行此操作。在SQL中实现这一点可能要困难得多,但SQL并不是真正的关系语言


当然,您可以通过关联方式执行此操作并不一定是一个好主意…

正如David指出的,理论允许属性值为集合类型

然而,在您的例子中,这只是为了建模n:m关系(我说得对吗),它根本不适用

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


如果需要处理空集合和非空集合,则集合类型属性最有用。世界上没有任何关系连接可以为您提供等效的功能。

正如David指出的,理论允许属性值为集合类型

然而,在您的例子中,这只是为了建模n:m关系(我说得对吗),它根本不适用

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