在MYSQL中儲存數組?
我已經用Google搜尋過了。我不斷得到與名為“serialize”的 PHP 函式有關的答案。我不會使用 PHP,所以遺憾的是,該解決方案對我不起作用。
我之前使用過 NoSQL db(我認為是 MongoDB),我基本上定義了一個集合
images [ {"title": "Cute puppy", "file"="cute.png", "tags": ["cute", "puppy", "summer", "pool"]} ]
我想在一行中為標籤列儲存多個值(老實說,我不知道我說得對不對,剛開始搜尋 MySQL)
+------------+----------+--------------------------+ | title | file | tags | +------------+----------+--------------------------+ | Cute Puppy | cute.png | cute,puppy,summer,pool | +------------+----------+--------------------------+
我想到的唯一想法是,如果我要使用 MySQL 讀取行,然後用逗號分隔標籤,那很可能會起作用,但我可能會使用更多的“標籤”百萬。
我的問題是,如果您想在一列中儲存多個值,MySQL 是一個不錯的選擇嗎?
My question really is, is mysql a good choice if you want to store multiple values in one column?
我建議這個問題的答案是否定的——在所有 3 個級別上都有更好的選擇來處理數據庫伺服器中的數組。
- 簡單數組: ========
MySQL 並沒有真正的數組數據類型——它們最接近的是SET 數據類型,其功能非常有限。正如您在問題中指出的那樣,搜尋會導致大量指向 PHP 程式碼的連結,這些程式碼在應用程序中實現數組功能,而不是在數據庫中。
PostgreSQL 有一種
ARRAY
數據類型,其中包含大量函式來處理數組中的元素的操作、比較和查找。2.JSON:
如今,數組已在很大程度上被 JSON 取代——這並不奇怪,因為 JSON 基本上是一個數組++(但 XML–:-))。這適用於MySQL和PostgreSQL。
在MySQL和PostgreSQL這兩個系統上都有大量可用的 JSON 函式,但在 PostgreSQL 上更多。我將交替使用術語 JSON 和 JSONB(二進制- 範例用於 mongodb,但通常適用於二進制 JSON)。MySQL JSON 只是二進制的,PostgreSQL 兩者都有——但 JSONB 通常被認為效率更高。有關PostgreSQL“NoSQL 類型”的優點,請參閱這篇文章。“NoSQL”用詞不當;您可以
JOIN
使用這些類型執行 SQL。關於索引 - MySQL 本質上是通過GENERATED 列 hack實現這一點,而 PostgreSQL 為 JSONB 實現 3 種索引(Gin、Btree 和 Hash - 請參見
8.14.4. jsonb Indexing
此處的部分)。可以在MySQL和PostgreSQL中的 JSON 和表之間進行連接。
總的來說,可以說 JSON 在 PostgreSQL 中比在 MySQL 中存在的時間更長並且更成熟。
經典 SQL:
您當然可以使用經典的關聯實體方法來實現一些“多元素”功能。關聯實體也稱為
joining
、bridging
或表。此處以註冊大學課程的學生為例概述了此策略。1 個課程可以有很多學生,1 個學生可以參加很多課程。連接表包含來自和表,連接表本身就是兩個在一起的 - 一個學生不能在同一門課程中兩次!many-to-many``m-to-n``PRIMARY KEY``course``student``PK
為了支持經典方法,Erwin Brandtstetter(一個非常值得一聽的關於數據庫的人!)在他的回答中指出了 JSON 解決方案:(
Aside: A normalized DB design with basic data types would be way more efficient for this.
)。JSON 不是靈丹妙藥,在使用時必須進行判斷。近年來,隨著從 2008 年到 2015年的 NoSQL“寒武紀大爆發”(尤其是 Mongodb),出現了很多跟風的趨勢。現在幾乎所有的 NoSQL 系統都已經或正在嘗試將SQL 介面和工具放入他們的系統中。為了我的錢,如果您的數組相對簡單,請堅持使用經典方法,否則請使用 JSONB。SQL 不是為處理逗號分隔的值列表而設計的,也不擅長處理這些值。在任何情況下,它們都違反了Codd 規則第 2 條,其中規定
Each and every datum (atomic value) in a relational data base is guaranteed to be logically accessible by resorting to a combination of table name, primary key value and column name.
. 使用 .csv 列表需要進一步的位置參數,SQL 不提供該參數,但各種系統都有“技巧”來解決這個問題。SQL 的強項是由小的簡單原子數據組成的“切片和切塊”記錄。PostgreSQL 是F/LOSS(自由/自由和開源軟體)系統,它最接近為所有 3 種數組方法提供最好的。MySQL 更廣泛,可能具有更好的內置和 3rd 方複製和/或分片,但 PostgreSQL 更符合標準,並且最近在這些領域取得了長足的進步。它還具有出色的 JSONB 功能。
ps - 哦,是的,我忘了 - 歡迎來到論壇!:-)