多站點系統的數據庫結構
我正在使用的系統結構如下。鑑於我打算使用 Joomla 作為基礎。
a(www.a.com),b(www.b.com),c(www.c.com) 是允許使用者搜尋預訂的搜尋門戶。
x(www.x.com),y(www.y.com),z(www.z.com) 是使用者進行預訂的酒店。
- www.a.com 的使用者只能搜尋 www.x.com 中的預訂
- www.b.com的使用者只能搜尋www.x.com,www.y.com的預訂
- www.c.com的使用者可以搜尋www.x.com、www.y.com、www.z.com上的所有預訂
所有 a、b、c、x、y、z 都執行相同的系統。但他們應該有單獨的域。因此,根據我的發現和研究架構,API 集成了所有數據庫呼叫。
鑑於此處僅顯示了 6 個實例(a、b、c、x、y、z)。最多可以有 100 個不同的搜尋組合。
我的問題,
我應該為整個系統維護一個數據庫嗎?如果是這樣,如果需要,我該如何拔出一個實例(例如:從系統中刪除 www.a.com 或從系統中刪除 www.z.com)?既然我用的是mysql,會不會因為記錄的數量而對系統來說很麻煩?
如果我為每個實例維護單獨的數據庫,我該如何進行搜尋?如何將所需的記錄整合到一起並進行搜尋?
是否有不同的數據庫方法可以使用而不是上面提到的?
您可以使用多個數據庫來執行此操作,但是當有更改時管理多個模式(推出、升級等)會更加困難。
單一數據庫設計是一種多租戶(既然您有正確的術語,您應該找到很多關於這些設計的資料),您需要設計這些分組結構。當然可以在單個數據庫中更輕鬆地建構跨租戶的搜尋。在單獨的數據庫中,您實際上必須跨數據庫進行查詢。這在 mysql 中是可能的,但在 SQL 語言中不支持從表中提取數據庫名稱來進行連接 - 您必須生成動態 SQL。
因此,而不是簡單地:
SELECT * FROM reservations r INNER JOIN hotel h ON h.hotel_id = r.hotel_id INNER JOIN site_hotel sh -- this table links hotels to sites and manages your search visibility in one place ON sh.hotel_id = h.hotel_id INNER JOIN site s ON s.site_id = sh.site_id WHERE s.site_name = 'www.a.com'
也許您必須使用動態 SQL 將此查詢建構為 UNION 查詢,其中預訂以不同數據庫名稱為前綴,用於來自類似酒店/站點連結表的網站允許的每個數據庫。
就像我說的那樣,分組結構將是關鍵,因為聽起來你的“租戶”將比簡單的關係少一點。但是,一旦您考慮了酒店和網站實體之間允許的關係,當然可以使用適當的結構來建構它。
如果您的租戶結構中有很多重疊,那麼如果“租戶”擁有自己的伺服器,如果他們有很高的負載,那麼很難擴展這個範圍,但是如果您的租戶被允許看到相當多的東西彼此,這更強烈地指向單一數據庫設計。