数据库关系 - 1:1但不总是?

时间:2011-05-04 21:49:38

标签: database database-design cakephp cakephp-1.3

对于相当无益的标题道歉,如果您有更好的建议,请随时编辑。

我正在使用CakePHP和烘焙功能(但我不需要烘烤)。

实现以下目标的最佳方式是什么:

表架构:

table ranges   
id | name | description

table images
id | range_id | picture

table info (here i am confused)
id | range_id | height | width | colour

基本上,一个范围可能有很多图像(1:很多)。我可以证明这很好。

现在,每个范围在info表(1:1)中都有一个条目,并且有一些关于范围的属性,如高度,颜色,宽度。但并不总是......

假设我有一个范围foofoo有五个images,它们都具有相同的高度,宽度和颜色。但是,foo有一个图像尺寸不同,颜色也不同。

当属性不同时,我需要使用相应的图片显示此信息,而不是ranges 默认信息。所以这个image将需要它在info表中的自己的条目。

这甚至有意义吗?或者我完全以错误的方式解决这个问题。

我的申请,简而言之: (如果有帮助,可以将“范围”视为产品)

  • 用户选择范围
  • 用户查看范围
  • 中的图片
  • 用户可以点击图片,info中的信息会弹出该范围。
  • 某些图片具有不同的属性,但仍属于相同的范围。
  • 如何区分并妥善保存?

如果我能进一步澄清,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:3)

我需要在父实体具有可被子实体“覆盖”的值的情况下执行此操作。

您可以采用几种方法将结构视为最简单的部分 考虑以下结构

table ranges   
id | name | description | default_info_id

table images
id | range_id | picture | info_id

table info
id | height | width | colour

image.info_id什么时候有值?有两种选择

使用来自父级的default_info_id填充image.info_id。然后用户可以在图像上覆盖它

<强>赞成

  • 您永远不需要查看范围以找出图像上的信息

缺点

  • 您需要决定range.default_info_id更改时要执行的操作。它是影响图像还是仅仅是为了将来

仅当images.info_id与父级不同时才填充它们。

<强>赞成

  • 如果在images.info_id为null时,parents.default_info_id发生变化,它也会自动更改

缺点

  • 当range.default_info_id发生变化时,你需要决定做什么。你现在需要将任何现在与父母相同的images.info_id归零吗?

  • 你需要查看rages表,找出当它为null时图像上的info_id。

您可以拥有多种上述数据结构,但您仍需要确定何时填充内容。以下是您可以考虑的另外两个有效(但在我看来不太理想)

信息对两个表都有一个FK,但其中一个始终为空

table ranges   
id | name | description 

table images
id | range_id | picture 

table info
id | range_id | image_id | height | width | colour

根本没有信息表

table ranges   
id | name | description | default_height | default_width | default_colour

table images
id | range_id | picture | height | width | colour