[英]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.