如何修复我的数据库模型以纠正独特的违规行为?

问题描述 投票:0回答:2

我知道主键值不能重复。然而,我想让游戏可以在多个平台上玩。例如 PC 和 PS4 上的《黑暗之魂》。如何修改关系设计,以便可以提供

SpelID
多个控制台而不重复?
这是我的代码:

drop table if exists Spel;
drop table if exists Plattform;
drop table if exists Företag;

create table Företag (
    FöretagID varchar(50) primary key,
    Företag text,
    Högk text
);

create table Plattform (
    PlattformID integer primary key,
    Plattform varchar (50)
);

create table Spel (
    SpelID integer primary key,
    namn varchar(50),
    genre text,
    år date,
    Åldergräns char(2),
   
    foreign key (SpelID) references Plattform (PlattformID),
    foreign key (namn) references Företag (FöretagID)
);

insert into Företag (FöretagID, Företag, Högk)
    values ('Zelda', 'Capcom', 'Japan'),
           ('Bloodborne', 'From', 'Japan');
        

insert into Plattform (PlattformID, Plattform)
    values (0001, 'Nintendo'),
           (0001, 'PS4'),
           (0002, 'PS4'),
           (0002, 'Nintendo');


insert into Spel (SpelID, namn, genre, år, Åldergräns)
    values (0001, 'Zelda', 'Äventyr', '2015-10-12', 7),
           (0002, 'Bloodborne', 'A-RPG', '2017-09-09', 18);
    

我尝试将它们添加到

Plattform
表中,但我知道主键只能有一个特定值。 (拼写=游戏)

postgresql database-design many-to-many
2个回答
0
投票

首先您需要删除当前的约束:

-- https://stackoverflow.com/questions/29075413/change-primary-key-in-postgresql-table
-- DROP THE Primary key
-- ALTER TABLE plattform DROP CONSTRAINT  plattform_pkey ;

-- not possible because of some forein keys, so drop other keys tooo:
ALTER TABLE plattform DROP CONSTRAINT  plattform_pkey CASCADE; 

警告:由于

CASCADE
,其他约束也被删除......您也必须重新创建这些约束! (更多信息请参见 DBFIDDLE)

然后您还需要将字段

SpellID
添加到表
Plattform

-- add field SpellID
ALTER TABLE plattform ADD COLUMN spellID INTEGER;

之后您可以重新创建表的主键

Plattform
:

-- add Primary KEY
ALTER TABLE plattform ADD PRIMARY KEY(plattformID, spellID);

参见:DBFIDDLE


0
投票

一款游戏可以在多个平台上发布,一个平台可以承载多款游戏。您的关系模型中的游戏和平台之间需要存在“多对多关系”。参见:

    如何在PostgreSQL中实现多对多关系?
  • 可能看起来像这样:

CREATE TABLE företag ( företagid integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY -- ! , företag text , högk text ); CREATE TABLE spel ( spelid integer GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY -- ! , företagid integer REFERENCES företag -- ! , spel text -- ! , genre text , år date , åldergräns integer -- ?! ); CREATE TABLE plattform ( plattformid text PRIMARY KEY -- !! natural key? , plattform text -- more? );

以上修改是小修复和其他建议。
神奇之处来了(m:n 关系的实现):


CREATE TABLE spel_plattform ( spelid integer REFERENCES spel , plattformid text REFERENCES plattform -- more? , PRIMARY KEY (spelid, plattformid) );

样本数据:

INSERT INTO företag (företagid, företag, högk) VALUES (1, 'Capcom', 'Japan') , (2, 'From', 'Japan') ; INSERT INTO spel (spelid, företagid, spel, genre, år, åldergräns) VALUES (1, 1, 'Zelda' , 'Äventyr', '2015-10-12', 7) , (2, 2, 'Bloodborne', 'A-RPG' , '2017-09-09', 18) , (3, 2, 'Elden Ring', 'A-RPG' , '2022-01-01', 18) ; INSERT INTO plattform (plattformid, plattform) VALUES ('NES', 'Nintendo Entertainment System') , ('PS4', 'PlayStation 4') ; INSERT INTO spel_plattform (spelid, plattformid) VALUES (1, 'NES') , (1, 'PS4') , (2, 'NES') , (2, 'PS4') , (3, 'PS4') ;

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.