這是完全正常的有所有應用程序使用同一個數據庫。
但是,您在運行不同的應用程序以不同的方式使用該數據庫的風險。
爲此,我建議你把儘可能多的邏輯儘可能在MySQL。
我不能告訴你如何做到這一點,因爲我不知道你的應用程序做什麼或需要,但我可以給你一些總體思路和指針。
總體思路和指針
您可以使用存儲過程/函數做的東西
如果您的應用使用存儲過程,以使單個數據庫的東西發生,所有的應用程序將在工作同樣的方式。
使用存儲函數對字段進行計算。 (例如,如使用存儲過程預訂交易)
Price_per_sales_line = price * quantity * 1+tax% * 1-discount%
如果你把這個邏輯在MySQL的功能,比你不必擔心應用程序A或B調試這一點,因爲所有的應用程序將以相同的方式工作。
而我個人最喜歡的
使用觸發器來確保正常發生。
E.g.如果你有,你需要在一個存儲過程中添加新的項目出售,你的把這個交易,但你也可以這樣做:
僞代碼
CREATE table blackhole_new_sales_item (
name varchar(45) not null
price decimal(10,2) not null
category_id integer not null)
ENGINE = Blackhole;
DELIMITER $$
CREATE TRIGGER ai_bh_new_sales_item_each FOR EACH ROW
BEGIN
/*all stuff inside a trigger happens in a single transaction*/
DECLARE new_item_id INTEGER;
INSERT IGNORE INTO items (name) VALUES (NEW.name);
SELECT id INTO new_item_id FROM items WHERE name = NEW.name;
INSERT IGNORE INTO item_categories (item_id, cat_id) VALUES (new_item_id, NEW.category_id)
INSERT INTO price (item_id, price, valid_from, valid_until) VALUES
(new_item_id, NEW.price, NOW(), '2038-12-31');
END $$
DELIMITER ;
在你的應用程序你可以做一個單一的:
INSERT INTO blackhole_new_sales_item VALUES ('test','0.99',2)
如果你改變你的數據庫的結構的觸發將採取一切照顧,你只需要改變觸發的內部,所有的應用程序將在不改變工作。
如果向黑洞表中添加額外字段,則只需在每個應用程序中更改單個調用。
您甚至可以創建一個額外的黑洞表併爲此創建一個單獨的觸發器,並使用回退代碼填充舊黑洞表觸發器以支持較舊的應用程序。
因此,這種方法爲您提供了一個指向所有數據庫邏輯的單一點,因此所有應用程序都將以相同的方式運行,同時仍然足夠靈活以支持升級。
希望這會有所幫助。
感謝您的回覆。我想我真的很困惑,現在當我坐下來思考時,我想我對自己需要發生的事情有了更清晰的認識。我們從設備收集數據並生成不同的報告,其中大多數這些提要非常適合作爲單獨的應用程序。諸如儀表板之類的一些報告需要來自差異Feed的數據。當你創建這樣一個應用程序,以便重用DTO或BL或DAO時,我們會在儀表板應用程序的WAR中將它們用作依賴的jar。因此,如果我寧願在數據庫中創建一個視圖,以執行所有JOIN(如果需要的話),以消除應用程序中的任何依賴性問題。你怎麼看?! – opensourcegeek 2011-06-11 19:38:31
創建視圖是一種選擇。但這聽起來像你也可能正朝着想要一個單獨的數據倉庫的方向發展。 – 2011-06-13 15:45:53
Stevi你讓我好奇,能否請你再解釋一下?我之前沒有使用過任何數據倉庫套件,所以任何方向都非常方便!再次感謝。 – opensourcegeek 2011-06-14 13:16:38