Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgreSQL中实现1:N关系(对象关系型)_Postgresql_Nested Attributes_Object Relational Model - Fatal编程技术网

在postgreSQL中实现1:N关系(对象关系型)

在postgreSQL中实现1:N关系(对象关系型),postgresql,nested-attributes,object-relational-model,Postgresql,Nested Attributes,Object Relational Model,我正在努力使用postgreSQL,因为我不知道如何将一个类型A的实例链接到一组类型B的实例。我将给出一个简单的示例: 假设我们想建立一个包含音乐专辑和人物的数据库,每个人都有他们最喜欢的专辑列表。我们可以这样定义类型: CREATE TYPE album_t AS ( Artist VARCHAR(50), Title VARCHAR(50) ); CREATE TYPE person_t AS ( FirstName VARCHAR(50), LastName VARCHAR(50), F

我正在努力使用postgreSQL,因为我不知道如何将一个类型A的实例链接到一组类型B的实例。我将给出一个简单的示例:

假设我们想建立一个包含音乐专辑和人物的数据库,每个人都有他们最喜欢的专辑列表。我们可以这样定义类型:

CREATE TYPE album_t AS (
Artist VARCHAR(50),
Title VARCHAR(50)
);

CREATE TYPE person_t AS (
FirstName VARCHAR(50),
LastName VARCHAR(50),
FavAlbums album_t ARRAY[5]
);
现在我们要创建这些类型的表:

CREATE TABLE Person of person_t WITH OIDS;
CREATE TABLE Album of album_t WITH OIDS;
现在,由于我想让我的DB尽可能地实现对象,我不想在table Person的FavAlbums行中嵌套album“objects”,但我想“指向”table album中的条目,这样n个Person记录就可以引用同一个album记录,而无需重复它

我读过这本手册,但它似乎缺少一些重要的例子,因为对象关系特性没有被经常使用。我也熟悉realational模型,但我想使用额外的表来表示关系

提前谢谢! 周末

现在,由于我想让我的DB尽可能地实现对象,我不想在table Person的FavAlbums行中嵌套album“objects”,但我想“指向”table album中的条目,这样n个Person记录就可以引用同一个album记录,而无需重复它


删除数组列,向每个表中添加id主键列(串行类型),删除OID(请注意,手册建议不要使用它们)。并添加一个带有两列(PersonId、AlbumId)的FavoriteAlbum表,后者是主键。(您的关系是n-n,而不是1-n)。

为什么要在postgresql中创建一个新类型来完成您需要的任务? 为什么不直接使用表格

具有n-n关系:

CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50)
);
CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
);
CREATE TABLE person_album (
  person_id integer,
  album_id integer,
  primary key (person_id, album_id),
  FOREIGN KEY (person_id)
    REFERENCES person (idperson),
  FOREIGN KEY (album_id)
    REFERENCES album (idalbum));
CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
); 
CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50),
  person_id integer,
  FOREIGN KEY (person_id)
    REFERENCES person (idperson)
);
或具有“纯”1-n关系:

CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50)
);
CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
);
CREATE TABLE person_album (
  person_id integer,
  album_id integer,
  primary key (person_id, album_id),
  FOREIGN KEY (person_id)
    REFERENCES person (idperson),
  FOREIGN KEY (album_id)
    REFERENCES album (idalbum));
CREATE TABLE person (
  idperson integer primary key,
  FirstName VARCHAR(50),
  LastName VARCHAR(50)
); 
CREATE TABLE album (
  idalbum integer primary key,
  Artist VARCHAR(50),
  Title VARCHAR(50),
  person_id integer,
  FOREIGN KEY (person_id)
    REFERENCES person (idperson)
);

希望我能帮助你。

很抱歉回答了我自己的问题,但我只想给出一些通过玩弄那个例子获得的信息

数组类型

我发现PostgreSQL中的数组类型在希望将可变数量的值与一个属性关联时非常有用,但前提是您可以使用重复的条目。因此,这种技术不适合根据“对象”的身份来引用它们

按标识对对象/记录的引用

因此,如果您想(如我的示例中所示)创建一个相册表,并希望能够由多个人引用一个相册,则应该使用单独的表来建立这些关系(可能通过使用OID作为键)


另一件疯狂的事情是在person表中使用OID数组来引用相册。但是这非常尴尬,而且实际上没有改进传统的关系样式。

您必须阅读关于关系而非对象关系的内容。谢谢,但我想说的是,postgreSQLObject relational支持的对象关系不是面向对象的。我所知道的唯一类似于postgresql中面向对象的东西是表继承。您可以使用postgresql中的关系表模拟对象行为,这是使用hibernate等技术的方法。谢谢。您的第一个答案是关系方式,当然,它是有效的。在第二个示例中,您不能将一张专辑与多个人关联。您好@das_weezul,您的评论是正确的,因此我将n-n关系和1-n关系分开。您在Postgres中要求1-n关系,在这种情况下,您不能将一个相册与多个人关联,因此@Denis告诉您,您真正需要的关系是n-n。此外,值得注意的是,“CREATE TABLE还会自动创建一个数据类型,表示与表中一行对应的复合类型。”--。我不建议您在PostgreSQL中使用数组或OID,尤其是在您不太了解数据库引擎的情况下。@das_weezul您能提供语法,说明您是如何做到这一点的吗