簡體   English   中英

PHP/MySQL:每個表字段有多個逗號分隔值與...什么?

[英]PHP/MySQL: Multiple comma separated values per table field vs... WHAT?

在單個表字段中存儲多個逗號分隔值是眾所周知的糟糕設計,因為它會影響性能並破壞關系。 除了我不知道如何改變事情。

我有一張電影表:

+------------------------------+
| id |       name       | year |
+------------------------------+
|  1 |       Alien      | 1979 |
|  2 |  Breakfast Club  | 1985 |
|  3 |    First Blood   | 1982 |
+------------------------------+

我需要存儲流派。 現在我需要一個單獨的流派表,因為將它插入同一個表是不行的。 但是如何構造呢? 我只能考慮兩種方法:使用外鍵或 boolean 類型字段,各有利弊。

外鍵

+---------------------+
| movie_id | genre_id | 
|----------+----------+
|    1     |    2     |
|    1     |    4     |
|    3     |    1     |
+----------+----------|

這里的問題是每個流派懲罰的一行。 要存儲不止一種流派,我必須像這樣運行多個插入查詢:

foreach($genres as $genre_id)
{
    $db->query("INSERT INTO genres (movie_id, genre_id) VALUES ('$movie_id', '$genre_id');
}

這不是過多的數據庫調用嗎? 它是引入流派的數量。 還有什么辦法呢?

boolean 類型字段

+----------+-----------+--------+-------+----------
| movie_id | adventure | comedy | drama | horror  ...
+----------+-----------+--------+-------+----------
|    1     |     0     |   1    |   0   |    1    ...
+----------+-----------+--------+-------+----------
|    3     |     1     |   0    |   0   |    0    ...
+----------+-----------+--------+-------+----------

這樣更好嗎? 這將讓我運行單個插入,除了復雜的查詢構建:

$query1 = "INSERT INTO genres (movie_id, ";
$query2 = " VALUES ('$movie_id', ";
foreach($genres as $key => $value)
{
    if($value)
    {
        $query1 .= "$key, ";
        $query2 .= "'$value', ";
    }
}
$query = rtrim($query1, ", ") . ")" . rtrim($query2, ", ") . ")";
$db->query($query);

我不知道這是否實用。

我不喜歡這兩種方法。 什么是更優雅的解決方案?

您知道單個 INSERT 語句可以插入多行嗎?

INSERT INTO genres (movie_id, genre_id) 
VALUES (?, ?),
       (?, ?),
       (?, ?)...

或者,即使您每次調用只執行一行,您也可以使用准備好的語句並使用不同的值多次執行它。

$stmt = $db->prepare("INSERT INTO genres (movie_id, genre_id) VALUES (?, ?)");
foreach($genres as $genre_id)
{
    $stmt->execute([$movie_id, $genre_id]);
}

我不會推薦您的第二個解決方案,將流派存儲為 boolean 列。 您可能會不時添加新類型,並且每次執行此操作時運行 ALTER TABLE ADD COLUMN 的成本很高。 然后你需要擔心給定表中最大 MySQL 可以支持多少列,等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM