Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 规范化现有多列、多字符串表的最佳方法?_Mysql - Fatal编程技术网

Mysql 规范化现有多列、多字符串表的最佳方法?

Mysql 规范化现有多列、多字符串表的最佳方法?,mysql,Mysql,我是mysql新手,非常感谢您的帮助:-) 让我们以电影数据库为例: movie_td (mov_id auto_increment pk, title, year, duration) actor_td (act_id auto_increment pk, name) director_td (dir_id auto_increment pk, name) movie_actor_td (movie_id fk, actor_id fk) movie_director_td (movie_id

我是mysql新手,非常感谢您的帮助:-)

让我们以电影数据库为例:

movie_td (mov_id auto_increment pk, title, year, duration)
actor_td (act_id auto_increment pk, name)
director_td (dir_id auto_increment pk, name)
movie_actor_td (movie_id fk, actor_id fk)
movie_director_td (movie_id fk, director_id fk)
我知道如何将.csv类型的文件插入到一个td中,其中所有名称都存储在一列中,但以规范化格式执行此操作有点混乱。如果我已经将所有数据存储在一个表中,那么首先创建一个静态mov_id以便我可以引用其余的列,这有意义吗?还是有更好的方法


谢谢

如果您将所有数据存储在一个表中,那么如果您的电影中有多个演员或多个导演,您将面临问题

这种规范化的数据库方法可以更好地避免数据库表中冗余数据的插入、更新和删除异常


此外,如果同一个演员与许多电影有关,则必须为电影的每一行写上相同的名字(演员/导演)。因此,在特定行而不是其他行中更新actor/director名称将导致表中actor/director名称的不一致性。

如果按照定义,如果每个属性的域仅包含原子值,则关系为第一范式,每个属性的值只包含该域中的一个值。(来源:)

因此,当您在一行中插入多个以逗号分隔的值时,您违反了第一个NF本身!这是因为数据之间存在多对多关系,并且您没有正确映射它

此外,您会问一个非常基本的问题-
如果我已经将所有数据存储在一个表中,那么首先创建一个静态mov_id以便我可以引用其余的列,这有意义吗?
-如果您只想将所有数据存储在一个表中,为什么不使用XML呢?您将有一个单独的文件存储所有相关数据。但事实是,使用XML无法运行完整的应用程序。XML有不同的用途,数据库表有不同的用途。您确实需要一个数据结构,该结构可以根据需要进行查询,而不必担心存储是如何进行的。我建议您阅读Korth关于数据库设计的书

谈到设计数据库和表结构,您是否知道如何将.csv文件存储到列中并不重要。重要的是开发复杂的代码从CSV列获取值需要多长时间。为了获取值,编写一些简单的查询总是比编写复杂的搜索循环要好

让我们看一看您发布的示例。我只需要三张桌子

考虑一下表
movie\u td
(我不理解
\u td
部分背后的原因,但我会坚持使用它,因为您发布了它。)此表存储有关电影的信息。现在,在现实世界中,一部电影可能有多个属性(列),如标题、发行日期(现在,这也取决于它发行的地区,它可能根据地区有多个发行日期,这是一个完全不同的故事)、运行时间、导演姓名(到目前为止,我只看过一位导演或两位导演的电影。我还没有看过一部多导演的电影;),等等

我们必须在这里考虑两个事实:

  • 一部电影有多个演员扮演多个角色
  • 一个演员可能在多部电影中演出
这给我们提供了演员和电影之间的多对多关系,这就是表
movie\u actor\u td
进入画面的地方。该表存储了哪个电影中有哪个演员,其中
movie\u id
actor\u id
每一个都是一个。一部电影可能在该表中有多个条目与这些多个演员对应一个演员在这张表中也可能有多个条目来对应那些多部电影,因此这些条目之间保持着相互的多对多关系

采用这种结构的一个主要原因是查询表。如果在movies表中存储以逗号分隔的演员姓名,则无法使用演员id向下搜索演员的数据-无法获取演员的其他详细信息,如出生日期和其他生物数据

如果有人问你这个演员已经拍了多少部电影呢?你会在每一行的CSV栏中查找演员的名字吗?速度会有多快

但是现在您已经有了给定的表结构,您可以通过以下简单的查询来发现:

SELECT count(*)
  FROM movie_actor_td
 WHERE actor_id = (SELECT actor_id
                     FROM actor_td
                    WHERE name = 'foo');

让我们考虑一个更复杂的例子。对于这个,我将自由添加一个列<代码>字符名称<代码>到表>代码> MeViviaActhToT.<代码>,作为一个演员通常在电影中扮演一个单独的角色。所以你的<代码>

movie_actor_td (movie_id, actor_id, character_name)
现在,有一位演员在1996年上映的电影《黄金眼》中扮演了詹姆斯·邦德。我不知道他的名字。我想知道他在2002年拍了多少部电影。我简单地问一下:

SELECT COUNT(*)
  FROM movie_actor_td
 WHERE actor_id = (SELECT actor_id
                     FROM movie_actor_td
                    WHERE     movie_id = (SELECT movie_id
                                            FROM movie_td
                                           WHERE     name = 'Goldeneye'
                                                 AND release_year = 1996)
                          AND character_name = 'James Bond');
如果您将所有数据存储在一个CSV列中,您能如此轻松地获取这些数据吗?我对此表示怀疑。我建议您继续使用当前的模式。

编辑


您首先询问如何创建一个静态
mov_id
并引用所有其他列。我认为您需要进一步了解,首先是数据库约束。然后阅读MySQL中的自动递增列值。

您能通过发布几行示例数据来帮助我们了解您正在处理的内容吗?基本上是规范简化是为了避免冗余数据。让我举一个简单的例子:假设你有一个产品,在10000个销售列表中,你必须将该产品放在你的列表中,比如:
sell1 product1 price1/newline/sell2 product1 price1……等等
,这样你就可以复制数据并在数据库中存储不必要的数据。当你规范化你使用相同的id来