我正在研究包含诸如库
之类的新Web应用程序过去各种各样的部分在数据库中都有不同的属性,我不能将它们存储在一个数据表中,所以我需要创建3个不同的表。
访客可以对书籍,文件和图片发表评论,我想开发一个评论模块,并将所有评论存储在一个表格中,让我们称之为(评论)
我的问题是,我必须遵循什么策略来完成这项工作?
我正在考虑创建参考列[reference_id] [nvarchar 50]
我将存储像这样的评论
files_{id of file}
pictures_{id of picture}
等等......那会是一个很棒的方法吗?感谢
答案 0 :(得分:1)
您应该使用单独的ItemId和ItemType。
此外,您可以使用ItemTypes创建表并存储ItemId和ItemTypeId。
这样的结构:pictures_{id of picture}
会浪费大量空间,对性能或后期代码开发没有帮助。
示例:如何从以下内容中删除项目类型:
picture_1234
你必须搜索“_”,将截断的文本转换为数字,并编写大量的SQL代码......
答案 1 :(得分:0)
我回答了一个非常相似的问题: In a StackOverflow clone, what relationship should a Comments table have to Questions and Answers?
在你的情况下,我建议创建一个表评论:
CREATE TABLE Commentables (
item_id INT AUTO_INCREMENT PRIMARY KEY
item_type CHAR(1) NOT NULL,
UNIQUE KEY (item_id, item_type)
);
然后,Books,Pictures,Files中的每一个与Commentables都有1:1的关系。
CREATE TABLE Books (
book_id INT PRIMARY KEY, -- but not auto-increment
item_type CHAR(1) NOT NULL DEFAULT 'B',
FOREIGN KEY (book_id, item_type) REFERENCES Commentables(item_id, item_type)
);
对图片和文件执行相同操作。 book_type对于书籍应始终为“B”,对于图片始终为“P”,对于文件始终为“F”。因此,您无法将书籍和图片引用到Commentables中的同一行。
然后您的评论可以引用一个表,Commentables:
CREATE TABLE Comments (
comment_id INT AUTO_INCREMENT PRIMARY KEY,
item_id INT NOT NULL,
FOREIGN KEY (item_id) REFERENCES Commentables (item_id)
);