用于存储不同供应商的客户评论的正确关系数据库设计是什么?

What is a correct relational database design for storing client reviews for different vedors?

我正在设计一个数据库,我与供应商有一个 table,每个供应商都可以让人们审查它们。

这是我的tables(为了这个问题的目的,我保持简单):

vendor_table

vendor_id | vendor_name | vendor_location | vendor_email       | vendor_phone
1         | User One    | LocationOne     | emailOne@test.com  | 000000001
2         | User Two    | LocationTwo     | emailTwo@test.com  | 000000002

reviews_table

review_id | customer_name | rating | review_text | vendor_id
1         | Customer One  | 5      | mediumtext  | 2
2         | Customer Two  | 2      | mediumtext  | 1
3         | Customer 3    | 5      | mediumtext  | 2
4         | Customer 4    | 5      | mediumtext  | 2

我的问题是:这有意义吗?使用 review_idvendor_id 作为外键创建一个名为 vendor_reviews 的 link table 会更好吗?如果是这样,为什么会比现在的设计更好?

是的,构建一个桥梁 table 来表示 n 对 m 的关系是有意义的,这样评论者就可以对同一供应商的每次销售进行评论。但你需要稍微调整一下你的 tables。

评价table

review_id | customer_id | rating | review_text | vendor_id

还有一位顾客Table

customer_id | customer_name .....

另一方面,如果您没有位客户table,您就无法建立n:m关系。

而是保留您的设计,因为它只是供应商和评论之间的一对一关系

不是1:1 -- 每个“1”个供应商都有“很多”评论。所以它是 2 tables 就像@nTuply 开始的那样。

如果您不识别“客户”,则无需为他们提供 table。也就是任何人都可以写评论,编个名字等等。这使得它不many:many.

如果是1:1,你不妨把table组合起来。

1:many (or many:1) -- 注意从“many”(reviews.vendor_id)到“1”(table vendors)。您在 vendors 中有一个关于 vendor_id 的索引——即 PRIMARY KEY。如果您想列出供应商的所有评论,您需要 INDEX in reviewsFOREIGN KEY 是可选的。

1:1 将共享一个主键。

Many:many 需要一个额外的 table,通常不超过两列 -- ids linking 到两个 tables。两个 FOREIGN KEYs 是可选的。更多关于 many:many -- http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table