2011-05-04 21 views
0

道歉的相當無益的標題,如果你有更好的建議,請隨時編輯它。數據庫關係 - 1:1但不總是?

我正在使用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

爲什麼你不在圖像表中存儲高度/寬度/顏色? – stevecomrie 2011-05-04 21:52:22

+0

@stevecomrie - 好點,但信息與'range'而不是'image'關聯,除了突出顯示的示例。如果我要用圖像存儲信息,那麼在9/10的情況下我會有數據冗餘。 (在我目前的架構/至少設置) – Dave 2011-05-05 08:14:54

回答

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.defau lt_info_id更改。它會影響圖像還是僅僅爲了將來

只填充images.info_id,當它不同於父級。

優點

  • 如果在images.info_id爲null,它會自動改變以及

缺點的parents.default_info_id改變

  • 你需要決定什麼時候響e.default_info_id更改。您是否需要現在將任何與父級相同的images.info_id歸零?

  • 您需要查看rages表以瞭解圖像中info_id在null時的含義。

你可以有幾種不同的上述數據結構,但你仍然需要確定何時填充什麼。這裏有兩個人,你可以認爲是有效的(但在我看來不太理想)

信息有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 
+0

感謝您花時間做出這樣的詳細迴應。我認爲從長遠來看,第一種選擇會更好。會看到我如何繼續。 – Dave 2011-05-05 08:19:50