2013-08-16 10 views
0

我正在使用mysql數據庫和java。我對裝飾器模式的理解是,它允許非常靈活的運行時,因爲您可以根據需要分配儘可能多的裝飾器,直到獲得所需對象的行爲或表示形式。我之前已經成功編寫了幾個裝飾器,現在我想將裝飾對象的狀態存儲到數據庫(最好是mysql)中。例如:在mysql數據庫表中反映裝飾模式

假設我正在爲一家咖啡店編碼系統,而我用於表示飲料成本的模型使用了一個裝飾器(即具體物件是濃咖啡,它可以用牛奶,糖,鞭子奶油,糖漿裝飾以及其他任何他們今天在咖啡中放入的東西)。此外,假設我目前還不能預測未來咖啡中有多少種不同的成分(也許有一天人們會想要咖啡豆中的糖豆,但我不會知道這一點)

現在我想記錄每次有人買飲料,並跟蹤使用的成分。設計我的數據庫模式的最佳方法是什麼,以便它能夠處理新的成分。我目前有兩個想法,這兩種想法似乎都不是正確的方法:

1)將飲料編碼爲json字符串,並將其轉儲到數據庫中,假設我的數據訪問對象可以處理此解碼。

2)嘗試預測飲料的所有可能的修改,併爲每個飲品製作專欄,每次有人想出新的飲料添加時,我都必須改變模式。

必須有比這兩者更好的方法。

+3

修飾符模式旨在將*行爲*添加到類中。你的問題很簡單。只需將「裝飾品」作爲附加成分存儲在數據庫中,並根據需要將其添加到咖啡中。如果出現新成分,則可以將它們作爲新成分記錄添加到數據庫中。 –

+2

使用兩張桌子:盤子(或更好的名字,如飲料)和配料可能? –

+0

您需要「飲料」和「配料」之間的「多對多」關係。特定於*特定飲料(訂單ID,折扣或其他)的各種屬性可以被存儲爲關係的屬性。 –

回答

0

嘗試使用3個表格,一個用於配料,一個用於訂單,以及兩者之間的查找表格。每次創建訂單時,您都要添加一行訂單,並添加許多行至orders_ingredients

create table orders { 
    order_id int AUTO_INCREMENT PRIMARY KEY, 
    order_name 
); 

create table orders_ingredients { 
    order_id references orders(order_id) 
    ingredient_id references ingredients(ingredient_id) 
); 

create table ingredients { 
    ingredient_id int AUTO_INCREMENT PRIMARY KEY, 
    ingredient_name varchar(255) 
);