如何为以下数据模型创建表?

时间:2018-02-13 06:01:26

标签: mysql sql

我需要为在线音乐流媒体服务创建数据模型,该服务有4个表:付款,用户,歌曲,流派。

IMGSHACK LINK FOR DATABASE STRUCTURE

我上传了结构图像,突出了表格与相应关联实体之间的关系。 (对于链接道歉,我不允许发布图片)

模型必须确保外键有效且参照完整性成立。

我曾尝试创建数据模型,并分配各自的外键,但作为一个初学者,我不确定我是否正确创建了数据模型,最重要的是创建了正确的外键关系,所以我可以添加和检索数据。

有人愿意检查我的代码吗?谢谢:)

付款表

CREATE TABLE Payment (

    PayID INTEGER,

    PayName CHAR (40),

    Primary Key (PayID)
);

歌曲表

CREATE TABLE SONG (

    SongID Integer,
    Title VARCHAR (40),
    Album VARCHAR (30),
    Duration TIME,
    ReleaseYear DATE,
    PRIMARY KEY (SongID)
);

流派表

CREATE TABLE GENRE (

    GenreID Integer,
    Name CHAR(35),
    Description VARCHAR (200),
    PRIMARY KEY (GenreID),

    CONSTRAINT foreinkey_holds_UserID FOREIGN KEY (UserID) 
    REFERENCES USER(UserID),

    CONSTRAINT foreignkey_holds_GenreID FOREIGN KEY (GenreID) 
    REFERENCES Genre(GenreID)
);

用户表

CREATE TABLE Users (

    UserID INTEGER, 
    UserFirst CHAR (40),
    UserLast CHAR (40),
    UserName VARCHAR (40),
    UserAddress VARCHAR (35),
    UserBirthdate DATE(),
    UserGender CHAR (1),
    UserEmail VARCHAR (35),

    PRIMARY KEY (UserID),

    CONSTRAINT foreignkey_holds_PayID FOREIGN KEY (PayID) 
    REFERENCES Payment(PayID),

    CONSTRAINT foreignkey_holds_SongID FOREIGN KEY (SongID) 
    REFERENCES Song(SongID)
);

2 个答案:

答案 0 :(得分:0)

付款表

CREATE TABLE Payment (
    PayID INTEGER,
    PayName CHAR (40),
    Primary Key (PayID)
);

流派表

CREATE TABLE GENRE (
    GenreID Integer,
    Name CHAR(35),
    Description VARCHAR (200),
    PRIMARY KEY (GenreID)
);

歌曲表(歌曲与流派之间的多对一)

CREATE TABLE SONG (
    SongID Integer,
    GenreID Integer,
    Title VARCHAR (40),
    Album VARCHAR (30),
    Duration TIME(),
    ReleaseYear DATE(),
    PRIMARY KEY (SongID),
    CONSTRAINT foreignkey_holds_GenreID FOREIGN KEY (GenreID) 
    REFERENCES Genre(GenreID)
);

用户表

CREATE TABLE Users (
    UserID INTEGER, 
    UserFirst CHAR (40),
    UserLast CHAR (40),
    UserName VARCHAR (40),
    UserAddress VARCHAR (35),
    UserBirthdate DATE(),
    UserGender CHAR (1),
    UserEmail VARCHAR (35),
    PRIMARY KEY (UserID)
);

用户与歌曲之间,多对多的关系。所以你需要一个关联表。最好在此表上使用复合主键(PRIMARY KEY(UserID,SongID))

CREATE TABLE Users_Song (
UserID INTEGER, 
SongID Integer,
PRIMARY KEY (UserID,SongID),
CONSTRAINT fk_users_song_user FOREIGN KEY (UserID) 
    REFERENCES Users(UserID),
CONSTRAINT fk_users_song_song FOREIGN KEY (SongID) 
    REFERENCES SONG(SongID)
);

再次,在支付与用户之间,多对多关系。所以你需要另一个关联表。此表上还有一个复合主键(PRIMARY KEY(UserID,PayID))

CREATE TABLE Users_Payment (
UserID INTEGER,
PayID INTEGER,
PRIMARY KEY (UserID,PayID),
CONSTRAINT fk_users_payment_user FOREIGN KEY (UserID) 
    REFERENCES Users(UserID),
CONSTRAINT fk_users_payment_pay FOREIGN KEY (PayID) 
    REFERENCES Payment(PayID)
);

答案 1 :(得分:0)

错过了一些基本的策略。例如,根据您的模型,您无法找到谁付款。为多对多关系创建基线或中间表。 例如:付款和用户表创建pay_user_middle,它使用由付款和用户表PK组成的复合密钥。