Mysql

在MYSQL中儲存數組?

  • June 20, 2020

我已經用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 個級別上都有更好的選擇來處理數據庫伺服器中的數組。

  1. 簡單數組: ========

MySQL 並沒有真正的數組數據類型——它們最接近的SET 數據類型,其功能非常有限。正如您在問題中指出的那樣,搜尋會導致大量指向 PHP 程式碼的連結,這些程式碼在應用程序中實現數組功能,而不是在數據庫中。

PostgreSQL 有一種ARRAY數據類型,其中包含大量函式來處理數組中的元素的操作、比較和查找。

2.JSON:

如今,數組已在很大程度上被 JSON 取代——這並不奇怪,因為 JSON 基本上是一個數組++(但 XML–:-))。這適用於MySQLPostgreSQL

在MySQLPostgreSQL這兩個系統上都有大量可用的 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 此處的部分)。

可以在MySQLPostgreSQL中的 JSON 和表之間進行連接。

總的來說,可以說 JSON 在 PostgreSQL 中比在 MySQL 中存在的時間更長並且更成熟。

經典 SQL:

您當然可以使用經典的關聯實體方法來實現一些“多元素”功能。關聯實體也稱為 joiningbridging或表。此處以註冊大學課程的學生為例概述了此策略。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 - 哦,是的,我忘了 - 歡迎來到論壇!:-)

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