在postgreSQL中实现1:N关系(对象关系型)
我正在努力使用postgreSQL,因为我不知道如何将一个类型A的实例链接到一组类型B的实例。我将给出一个简单的示例: 假设我们想建立一个包含音乐专辑和人物的数据库,每个人都有他们最喜欢的专辑列表。我们可以这样定义类型:在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
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您能提供语法,说明您是如何做到这一点的吗