Mysql

將不同類型的數據儲存在單個列中的最佳方法,應該是查詢友好的 - MySql

  • February 15, 2021

我正在開發一個項目,使用者可以通過簡單地選擇欄位數(最多 200 個)並為每個欄位定義數據類型,從 UI 創建自己的 Web 服務。我正在考慮以下表結構:

服務大師
+-----------+-------------+-------------+
| 服務標識 | 服務名稱 | 欄位計數 |
+-----------+-------------+-------------+
| 1 | 服務1 | 2 |
+-----------+-------------+-------------+
| 2 | 服務3 | 3 |
+-----------+-------------+-------------+

服務詳情
+------------------+-----------+--------+---------+-------+-------------+
| 服務詳情 ID | 服務標識 | 欄位1 | 欄位2 | 欄位3| 現場...200 |
+------------------+-----------+--------+---------+-------+-------------+
| 1 | 1 | 5 | 活躍 | 空 | 空... |
+------------------+-----------+--------+---------+-------+-------------+
| 2 | 2 | 高 | 9.0 | 7 | 空... |
+------------------+-----------+--------+---------+-------+-------------+
| 3 | 1 | 2 | 跑步 | 7 | 空... |
+------------------+-----------+--------+---------+-------+-------------+

我沒有在此處添加 DataTypeDetails 表以獲得簡潔的程式碼,但是是的,我有一個表來保存欄位的數據類型。如果您看到上面的表結構,我可以為所有欄位定義 Varchar 或任何字元串數據類型,但是如果我這樣做,那麼在對錶應用過濾器時,我必須使用它的原始數據類型 CAST 欄位數據。比如,9.0(Float)或 7(Int)等。如果我對所有列使用 TYPECASTING 來應用過濾器,我認為這會減慢查詢速度。這個能力可能有數十億或更多的記錄。

那麼有沒有其他方法可以實現更好的性能。

這基本上是關於多租戶應用程序的問題;和 cal 也被認為是實體屬性值場景的特定應用。

除了目前的方法之外,您還可以採用不同的方法:

  1. 每個使用者/服務每個租戶)有一個ServiceDetails表,根據他/她/它的需要定義欄位。您的查詢將使用…表,而不僅僅是 1。如果需要,您可以使用數據庫元數據 ( ),而不是使用表。這是最友好的查詢方式。ServiceDetails1``ServiceDetailsN``DataTypeDetails``information_schema
  2. 與其擁有field1, field2, ..., field200,不如擁有更大的欄位集合:field1_text, field1_integer, field1_float, field1_timestamp, field2_...並使用具有適合您特定情況的類型的列版本。您將擁有大量的 NULL,可能還有很多索引。這僅使用(一個非常大且稀疏的)表。這通常不是最好的方法,但有可能。
  3. 使用允許更靈活結構(例如 JSON)的數據庫用於變數模式。(可以索引的PostgreSQL JSONB數據類型非常適合這種情況;即使您仍然需要轉換類型)。

參考:

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