从MySql生成的sql脚本中了解表关系

时间:2016-03-21 05:02:40

标签: mysql database-schema

有四个表,两个主表," Page"和"类别",和两个关系表," category_page"和" page_category"。

Category和Page表之间的关系是什么?这在关系表中说了什么?

  KEY `FK71E8D943E46A97CC` (`id`),
  KEY `FK71E8D943BB482769` (`id`)

以下是完整架构:

--
-- Table structure for table `Category`
--
CREATE TABLE `Category` (
  `id` bigint(20) NOT NULL auto_increment,
  `pageId` int(11) default NULL,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `pageId` (`pageId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Table structure for table `Page`
--

CREATE TABLE `Page` (
  `id` bigint(20) NOT NULL auto_increment,
  `pageId` int(11) default NULL,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `pageId` (`pageId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Table structure for table `category_pages`
--
CREATE TABLE `category_pages` (
  `id` bigint(20) NOT NULL,
  `pages` int(11) default NULL,
  KEY `FK71E8D943E46A97CC` (`id`),
  KEY `FK71E8D943BB482769` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Table structure for table `page_categories`
--
CREATE TABLE `page_categories` (
  `id` bigint(20) NOT NULL,
  `pages` int(11) default NULL,
  KEY `FK72FB59CC1E350EDD` (`id`),
  KEY `FK72FB59CC75DCF4FA` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

3 个答案:

答案 0 :(得分:1)

我没有看到这些表之间存在任何外键关系。以下代码的目的是定义id列的索引。我不知道其意图,但其中一个是冗余索引。

KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)

答案 1 :(得分:1)

我的猜测是有人尝试CategoryPage之间建立多对多关系,尽管没有声明性约束来强制执行它。 category_pagespage_categories看起来相同,因此其中一个是多余的,另一个是KEY索引。

FK71E8D943E46A97CC这样的字符串只是索引的名称。 FK前缀表示可能 对于外键约束,但正如我所说,没有声明性约束来强制执行它。

早期版本的MySQL(< 5,我认为)没有强制执行外键,而MyISAM存储引擎(曾经是默认设置)仍然没有。该模式可以来自那些早期版本之一,因此设计者可能在简洁的误导努力中省略了约束声明。在任何情况下,FK关系必须在应用层中实现,但在应用上依赖 来约束强制执行通常是一个坏主意,因为它必须在每个应用程序中单独执行,并且它太容易变得懒惰并且将其留下以便稍后返回来修复它。

答案 2 :(得分:1)

KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)

正确知道这些是简单的索引,而不是外键,Fk ...用作前缀来理解它是外键而不是外键本身,直到没有像下面的子表和主表的映射 -

CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...

每当我们创建外键时,它会自动创建一个索引,我们正在创建外键的字段,所以最后外键应该如下所示 -

KEY `FK71E8D943E46A97CC` (`id`),
CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...

在这里,似乎有人试图创建外键但随后删除外键。因为mysql会删除你的外键,但不会删除索引,所以它们会保留在表中。

现在,因为您在表中的相同字段ID上有重复的索引,所以您应该删除它们,即使您应该删除索引并在id字段上创建主键,以便在此字段中不保留重复/空值时获得更好的性能