【问题标题】:Implement 1:N relation in postgreSQL (object-relational)在 postgreSQL 中实现 1:N 关系(对象关系)
【发布时间】:2011-10-05 16:12:44
【问题描述】:

我正在努力使用 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;

现在,由于我想让我的数据库尽可能地具有对象关系,我不想将专辑“对象”嵌套在 Person 表的 FavAlbums 行中,但我想“指向”中的条目表 Album,以便 n 个 Person 记录可以引用同一个 Album 记录,而不会一遍又一遍地重复。

我阅读了手册,但似乎缺少一些重要的示例,因为对象关系功能并未经常使用。我也熟悉关系模型,但我想为关系使用额外的表。

提前致谢! das_weezul

【问题讨论】:

  • 您必须阅读有关关系而非对象关系的内容。
  • 谢谢,但我想做的是 postgreSQL 支持的对象关系
  • 对象关系不是面向对象的。我知道的唯一类似于 postgresql 中面向对象的事情是表继承。
  • 您可以在 postgreSQL 中使用关系表来模拟对象行为,例如,这是使用 hibernate 等技术的方法。

标签: postgresql nested-attributes object-relational-model


【解决方案1】:

很抱歉回答了我自己的问题,但我只是想提供一些通过玩弄该示例获得的信息。

数组类型

我发现如果你想将可变数量的值与一个属性相关联,那么 PostgreSQL 中的 ARRAY 类型很有用,但前提是你可以忍受重复的条目。因此,该技术不适用于通过身份引用“对象”。

按身份引用对象/记录

因此,如果您想(如我的示例)创建一张专辑表并希望能够由多个人引用一张专辑,您应该使用单独的表来建立这些关系(也许通过使用 OID作为键)。

另一件疯狂的事情是通过在 person 表中使用 OID 的 ARRAY 来引用专辑。但这很尴尬,并没有改善经典的关系风格。

【讨论】:

  • 我不建议你在 PostgreSQL 中使用数组或 Oids,尤其是如果你对数据库引擎不太了解的话。
  • @das_weezul 你能否提供语法,你是如何做到的
【解决方案2】:

为什么要在 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));

或具有“纯”1-n 关系:

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)
);

希望对你有帮助。

【讨论】:

  • 谢谢。您的第一个答案是关系方式,它当然有效。在您的第二个示例中,您不能将一张专辑与多个人相关联。
  • 嗨@das_weezul,您的评论是正确的,因此我将n-n 关系和1-n 关系分开。您在 Postgres 中要求 1-n 关系,在这种情况下,您不能将一张专辑与多个人相关联,因此@Denis 说您实际上需要的关系是 n-n。
  • 另外,值得注意的是“CREATE TABLE 还会自动创建一个数据类型,该数据类型表示对应于表的一行的复合类型。” -- CREATE TABLE.
【解决方案3】:

现在,由于我想让我的数据库尽可能地具有对象关系,我不想将专辑“对象”嵌套在 Person 表的 FavAlbums 行中,但我想“指向”中的条目表 Album,这样 n 个 Person 记录就可以引用同一个 Album 记录,而不会一遍又一遍地重复。

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

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多