数据库设计:如何处理具有非唯一外键的表

时间:2012-07-09 16:19:33

标签: mysql database

我有一个表products和一个categories表,这两个表都可以选择在images表中包含相关记录。

images.fk

1可能指向categories.idproducts.id,因此我添加了一列images.related_to

当我想要检索某个类别及其图像时,我会使用

WHERE categories.id = images.fk AND images.related_to = 'categories'

但显然现在如果类别没有图片,我的查询将不会返回任何内容,因为WHERE images.related_to = 'categories'

我可以通过首先运行查询来查看该类别是否有图像来解决这个问题,但这似乎不是一个好的解决方案。

images.fk不包含唯一值会被认为是错误的设计吗? 我应该有单独的categories.imagesproducts.images表吗?那么如果我还有usersshopssuppliers的图片怎么办?

3 个答案:

答案 0 :(得分:1)

另外两张桌子说

ProductImages(ProductId,ImageId)CategoryImages(CategoryID,ImageID)

然后,ProductImages拥有产品的FK和FK To Images

CategoryImages有一个FK到类别和一个FK到图像

是经典的解决方案。

答案 1 :(得分:1)

如果我理解你的问题我会这样做:

  • 产品和类别之间的基数为N:M(产品可以有多个类别,一个类别属于多个产品
  • 我添加了另一个名为“IMAGES”的表,一个产品可以有多个图像,一个图像属于一个产品,因此基数为1:N

您只需添加其他属性即可。

enter image description here

答案 2 :(得分:1)

您可以考虑images,因为它是一个多用途的图像存储。制作images主键auto_increment并且不要将fk存储在此表中:images(image_id, src, size, etc... , Primary(image_id))

创建一个(或三个)更多表(简化代码):images_on_categories (category_id, image_id, Primary(category_id, image_id))

或者:images_on_users (user_id, image_id, Primary(user_id, image_id))

您可以像这样创建FK:FOREIGN KEY (images_on_users.user_id) REFERENCES users (users.user_id)