2012-07-09 53 views
1

我有一个表products和一个categories表,它们都可以有选择地在images表中具有相关记录。数据库设计:如何处理具有非唯一外键的表

images.fk1的值可以指向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表吗?那么,如果我也有图像usersshops,suppliers

回答

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)

1

两个更多的表说

ProductImages(产品编号,图像标识)CategoryImages(类别ID,图像标识)

然后ProductImages有FK到产品和和FK将图像

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

是经典的解决方案。

1

如果我理解好您的问题,我会做这种方式:

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

你只需要添加其他属性

enter image description here

相关问题