繁体   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