1

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

"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 表并确保将它们的名称存储在相应的图片表条目中来对其进行微观管理。

4

2 回答 2

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)
);
于 2011-03-19T14:12:25.410 回答
0

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

示例查询:

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

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

示例查询:

FROM    picture INNER JOIN ratingTemplate ON picture.FileId = ratingTemplate.FileId
WHERE   picture.FileId = 257
于 2011-03-19T14:22:08.540 回答