2

我正在努力使用 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 行中,但我想“指向”表专辑中的条目, 这样n 个Person 记录就可以引用同一个 Album 记录,而不会一遍又一遍地复制它。

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

4

3 回答 3

5

为什么你在 postgresql 中创建一个新类型来做你需要的事情?为什么不直接使用表?

与 nn 关系:

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

我希望我能帮助你。

于 2011-07-15T10:34:47.480 回答
3

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

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

于 2011-07-15T03:47:04.513 回答
0

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

阵列类型

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

按身份引用对象/记录

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

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

于 2011-07-15T12:36:58.607 回答