PostgreSQL尝试在2个表之间创建关系

时间:2019-12-14 17:39:19

标签: sql postgresql

大家好,我是PostgreSQL的新手,我正在尝试建立一个简单的电影数据库,但是我不知道该怎么做,或者是否有可能用2个表创建一个关系。

create table Movie(
    id_movie int PRIMARY KEY,
    title char(50),
    release date,
    url char(100),
    local char(50),
    resume char(200)
);

create table Categories( 
    category char(50),
    id_movie int,
    foreign key (id_film) references Movie(id_movie) on delete restrict
);

我希望使每部电影都与一个或多个类别相关联,但是使用我的代码,所有电影都具有所有类别。有人知道这是否可能吗?

2 个答案:

答案 0 :(得分:2)

通常用第三张表来建模。该表具有电影的ID和每行类别的ID。当且仅当电影属于某个类别时,该行中才会包含该电影的ID和该类别的ID。

CREATE TABLE movie
             (id_movie integer,
              title char(50),
              release date,
              url char(100),
              local char(50),
              resume char(200),
              PRIMARY KEY (id_movie));

CREATE TABLE category
             (id_category integer,
              category char(50));

CREATE TBALE movie_category
             (id_movie integer,
              id_category integer,
              PRIMARY KEY (id_movie,
                           id_category),
              FOREIGN KEY (id_movie)
                          REFERENCES movie
                                     (id_movie),
              FOREIGN KEY (id_category)
                          REFERENCES category
                                     (id_category));

答案 1 :(得分:1)

如果您要允许电影具有多个类别,则

@stickybit是正确的。这并非不合理。但是,如果不是这种情况,并且您想确保电影仅属于1类,那么您的fk结构将被反转。 M:M关系和1:M关系之间的区别。

create table categories( 
       category_id  serial 
     , category     character varying(50) 
     , constraint   categories_pk primary key (category_id) 
     , constraint   category_uk unique(category )  
);


create table movies(
       movie_id     serial
     , category_id  int       
     , title        character varying(50)
     , release_dt   date
     , url          character varying(100)
     , _local       character varying(50)
     , resume       character varying(200)
     , constraint   movies_pk primary key(movie_id)   
     , constraint   movies_uk unique(title)
     , constraint   movies2category_fk
                    foreign key (category_id)
                    references categories(category_id)          
);

其他一些随机注释:

  • 请勿使用名称“ local”和/或“ release”。尽管Postgres并不认为它们是关键字,但SQL标准会考虑,至少根据Postgres Appendix C而言。或任何其他列出的值,它们可以在任何将来的任何时间保留。
  • 使用可变字符而不是char。 Char是fixed length,因此对于标题char(50)始终需要50个字符,即使对于电影“ W”也是如此。尽管Postgres为尾随空格提供了“津贴”,但大多数时候都是如此。
  • 您可能想养成命名约束的习惯,特别是如果您(将)与其他DBMS一起工作。 Postgres在生成名称方面做得非常好,其他的则不多。如果您花了很多时间解决诸如SYS_C0010676之类的constarint问题,您将不胜感激。