Mysql

多站點系統的數據庫結構

  • November 27, 2012

我正在使用的系統結構如下。鑑於我打算使用 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 查詢,其中預訂以不同數據庫名稱為前綴,用於來自類似酒店/站點連結表的網站允許的每個數據庫。

就像我說的那樣,分組結構將是關鍵,因為聽起來你的“租戶”將比簡單的關係少一點。但是,一旦您考慮了酒店和網站實體之間允許的關係,當然可以使用適當的結構來建構它。

如果您的租戶結構中有很多重疊,那麼如果“租戶”擁有自己的伺服器,如果他們有很高的負載,那麼很難擴展這個範圍,但是如果您的租戶被允許看到相當多的東西彼此,這更強烈地指向單一數據庫設計。

引用自:https://dba.stackexchange.com/questions/29366