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