整个表的mysql外键

时间:2011-03-19 14:02:13

标签: mysql sql nested create-table

我是数据库的新手,但我已经阅读了一些教程并学习了大部分基本知识(我是一名长期的程序员)。但是,我需要一些帮助来解决关系数据库的局限性。如果我有一张图片,我可以为它创建一个简单的表格

"CREATE TABLE picture(
file VARCHAR(150),
rating INT
)";

如果我想跟踪图片的费率,我可以硬编码预设数量的选民(例如3个匿名投票)

"CREATE TABLE picture(
file VARCHAR(150),
rating INT,
vote1 INT,
vote2 INT,
vote3 INT
)";

或者对于无限数量我可以创建一个新表

"CREATE TABLE ratingTemplate
(
rater INT,
rating INT
)";

但是对于图片表中的每个图片条目,我想要引用整个ratingTemplate表。有没有正确的方法来使用外键来实现这一目标?目前,我通过创建新的ratingTemplate表并确保将其名称存储在相应的图片表条目中进行微观管理。

2 个答案:

答案 0 :(得分:2)

是的,你必须有一个表来保持对图片表和用户表的引用。

CREATE TABLE IF NOT EXISTS PICTURE (
    PICTURE_ID  BIGINT NOT NULL AUTO_INCREMENT,
    FILE            VARCHAR(250),
    PRIMARY KEY (PICTURE_ID)
);

CREATE TABLE IF NOT EXISTS USER (
    USER_ID     BIGINT NOT NULL AUTO_INCREMENT,
    --....REST OF COLUMNS HERE...

    PRIMARY KEY(USER_ID)
);

CREATE TABLE IF NOT EXISTS PICTURE_RATING (
    RATING_ID       BIGINT NOT NULL AUTO_INCREMENT,
    PICTURE_ID  BIGINT NOT NULL,
    USER_ID     BIGINT NOT NULL,
    RATING      DOUBLE,

    PRIMARY KEY (RATING_ID),
    FOREIGN KEY (PICTURE_ID) REFERENCES PICTURE(PICTURE_ID),
    FOREIGN KEY (USER_ID) REFERENCES USER(USER_ID)
);

答案 1 :(得分:0)

您尚未确定“图片”表的主键,但如图所示,主键似乎是“文件”列。您需要在名为'file'的'ratingTemplate'表中添加一个列,该表也将是varchar(150。'ratingTemplate'中的主键是'file'和'rater'的组合.'file 'ratingTemplate'表中的列将是'picture'表中'file'列的foriegn键。

示例查询:

SELECT  picture.file, rater, rating
FROM    picture INNER JOIN ratingTemplate ON picture.file = ratingTemplate.file
WHERE   picture.file = 'filenameiwant'

另一种方法是将代理主键添加到“图片”表中。 也许将'FileId'命名为整数。在这种情况下,您可以使用'ratingTemplate'中的'FileId'列作为foriegn键而不是'file'。对于大型数据集,这将更快地执行并占用更少的空间。

示例查询:

FROM    picture INNER JOIN ratingTemplate ON picture.FileId = ratingTemplate.FileId
WHERE   picture.FileId = 257