正确的数据库设置 - 连接太多?

Posted

技术标签:

【中文标题】正确的数据库设置 - 连接太多?【英文标题】:Proper DB setup - too many joins? 【发布时间】:2017-05-04 13:03:33 【问题描述】:

我正在建立一个数据库,其中包含电影、导演、摄影师、配乐作曲家等。

现在每部电影都有一行标题、描述等。此外,还应该有一列用于导演、作曲家等。

我不想在电影表的每一行都重复导演的名字,所以我把导演放在不同的表中,作曲家放在不同的表中等等。

在电影表中,然后我用外键引用导演、作曲家等数据。

要获取电影的所有数据,我会创建一个视图,将所有表连接在一起,这样一个 mysql 查询就可以为我提供电影的人类可读信息。

这是一个好方法吗?还是多个左连接不是一个好主意?

视图看起来像这样(种类)

SELECT `movies`.`title` as `title`, `movies`.`description` as [...],
`directors`.`name` as `name` [...], `composers`.`name` as `cname` [...]
from
    `movies`
left join
    `directors` on `movies`.`directors_id`=`directors`.`id`
left join
    `movies`.`musicians_id` = `musicians`.`id` [...]

这是一种有效的方法吗?

【问题讨论】:

你的方法叫做normalization,它是存储数据的好方法。 您的方法非常好。您可能希望在适当的情况下将 LEFT JOIN 替换为 INNER JOIN(例如,我猜每个动作都有一个导演)。 我仍然不太了解内连接和左连接之间的区别(我知道带有圆圈的图片。我相信需要更多地了解它)。感谢您的快速回答! 我明白你在重新发明***的感觉:那里有很多电影数据库 我的软件成功秘诀:如果你能买到,就不要建造它。 @onedaywhen:我建立这个数据库的原因可能有一百万个。也许我只关注那些不回答问题而是给出“智慧”的人的电影。但让我告诉你:老实说,我不打算做电影页面。这是一个例子,所以我不需要告诉我真正要做什么。 【参考方案1】:

正如 Gordon Linoff 所说,这称为规范化,一般而言是一种存储数据的好方法。

您在定义表的方式中当然需要左连接。如果将 LEFT 连接替换为 INNER JOIN,那么对于没有音乐家或导演的电影,结果中将根本没有行。

但是,您提议的规范化最终将包含许多表格,用于表示电影行业中不同的创意角色。即使要涵盖奥斯卡和其他奖项的主要创意角色,您也需要十张或更多张桌子。

避免这种情况的一种常见方法是为电影设置一个表格,为广告素材设置一个表格。第三个表用于连接不同角色的两者。例如:

TABLE CREATIVE_ROLES_LINK ( LIKN_ID INT, MOVIE_ID INT, ROLE_NAME VARCHAR(30), PERSON_ID INT);

上面显示了基本思想。在实践中,可以使用存储在另一个表中的 ROLE_NAME 进行更多的规范化。

【讨论】:

“归一化通常是一种存储数据的好方法”——现在有点轻描淡写了! 当数据现在像存储在 SQL 表中一样可能存储在文档和键值数据库中时,这并不是“轻描淡写”。

以上是关于正确的数据库设置 - 连接太多?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 PDO 连接

Flask,SQLAlchemy和多线程:MySQL连接太多

mysql连接数据库失败,请确定数据库用户名,密码设置正确

当 Access 2007 数据库设置为“使用 Sharepoint 联机工作”模式时,我的应用程序无法正确连接

MySQLNonTransientConnectionException:连接太多

java设置一个登录界面输入账号密码,与数据库内账号密码相比较,正确显示登录成功反之失败