了解 MySql 生成的 sql 脚本中的 table 关系
Understand the table relationship from sql scripted generated by MySql
有四个表,两个主表,"Page"和"Category",以及两个关系表,"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;
我没有看到这些表之间有任何外键关系。以下代码的目的是为 id
列定义索引。我不知道用意,但其中之一是冗余索引。
KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)
我的猜测是有人 试图 在 Category
和 Page
之间建立多对多关系,尽管没有声明性约束来强制执行它。 category_pages
和 page_categories
看起来相同,因此其中一个是多余的,另一个 KEY
索引也是多余的。
像FK71E8D943E46A97CC
这样的字符串只是索引的名称。 FK
前缀表明它 可能 是 打算 用于外键约束,但正如我所说,没有声明性约束来强制执行它.
MySQL 的旧版本(< 5,我认为)没有强制执行外键,而 MyISAM 存储引擎(以前是默认的)仍然没有。该模式可能来自这些早期版本之一,因此设计者可能为了简洁而误导了约束声明。在任何情况下,FK 关系都必须在应用程序层中 实现 ,但 仅 依赖于应用程序以进行约束 强制执行 通常是一个坏主意,因为它必须在每个应用程序中单独执行,而且很容易变得懒惰而忽略它,以便稍后返回修复它。
KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)
知道这些是简单的索引而不是外键,Fk ...用作前缀以理解它是外键而不是外键本身,直到没有子和主的映射table像下面-
CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...
每当我们创建外键时,它会自动在我们创建外键的字段上创建索引,所以最终外键应该如下所示-
KEY `FK71E8D943E46A97CC` (`id`),
CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...
在这里,似乎有人试图创建外键,但随后删除了外键。由于 mysql 将删除您的外键但不会删除索引,因此它们保留在 table.
现在,由于您在 table 中的同一字段 id 上有重复索引,因此您应该删除它们,即使您应该删除两个索引并在 id 字段上创建主键以获得更好的性能,如果您不保留 duplicate/null 该字段中的值。
有四个表,两个主表,"Page"和"Category",以及两个关系表,"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;
我没有看到这些表之间有任何外键关系。以下代码的目的是为 id
列定义索引。我不知道用意,但其中之一是冗余索引。
KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)
我的猜测是有人 试图 在 Category
和 Page
之间建立多对多关系,尽管没有声明性约束来强制执行它。 category_pages
和 page_categories
看起来相同,因此其中一个是多余的,另一个 KEY
索引也是多余的。
像FK71E8D943E46A97CC
这样的字符串只是索引的名称。 FK
前缀表明它 可能 是 打算 用于外键约束,但正如我所说,没有声明性约束来强制执行它.
MySQL 的旧版本(< 5,我认为)没有强制执行外键,而 MyISAM 存储引擎(以前是默认的)仍然没有。该模式可能来自这些早期版本之一,因此设计者可能为了简洁而误导了约束声明。在任何情况下,FK 关系都必须在应用程序层中 实现 ,但 仅 依赖于应用程序以进行约束 强制执行 通常是一个坏主意,因为它必须在每个应用程序中单独执行,而且很容易变得懒惰而忽略它,以便稍后返回修复它。
KEY `FK71E8D943E46A97CC` (`id`),
KEY `FK71E8D943BB482769` (`id`)
知道这些是简单的索引而不是外键,Fk ...用作前缀以理解它是外键而不是外键本身,直到没有子和主的映射table像下面-
CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...
每当我们创建外键时,它会自动在我们创建外键的字段上创建索引,所以最终外键应该如下所示-
KEY `FK71E8D943E46A97CC` (`id`),
CONSTRAINT `FK71E8D943E46A97CC` FOREIGN KEY (`id`) REFERENCES `Category` (`id`)...
在这里,似乎有人试图创建外键,但随后删除了外键。由于 mysql 将删除您的外键但不会删除索引,因此它们保留在 table.
现在,由于您在 table 中的同一字段 id 上有重复索引,因此您应该删除它们,即使您应该删除两个索引并在 id 字段上创建主键以获得更好的性能,如果您不保留 duplicate/null 该字段中的值。