我是数据库的新手,但我已经阅读了一些教程并学习了大部分基本知识(我是一名长期的程序员)。但是,我需要一些帮助来解决关系数据库的局限性。如果我有一张图片,我可以为它创建一个简单的表格
"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表并确保将其名称存储在相应的图片表条目中进行微观管理。
答案 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