使用MySQL的关系模式

时间:2016-01-18 17:50:04

标签: mysql relational-database entity-relationship

我正在开发一个系统,其目标是创建一个大型数据库来存储关键字(我确实有一个剪贴板来获取这些关键字)。

我使用分区来加速查询,这是我的初始结构:

CREATE TABLE `keywords` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `keyword` char(255) NOT NULL DEFAULT '',
  `currency` char(5) DEFAULT NULL,
  ....
  PRIMARY KEY (`id`,`keyword`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
/*!50500 PARTITION BY RANGE  COLUMNS(keyword)
(PARTITION p0 VALUES LESS THAN ('a') ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN ('b') ENGINE = InnoDB,
 ...
 PARTITION p25 VALUES LESS THAN ('z') ENGINE = InnoDB,
 PARTITION p26 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */

现在,我们要求新的要求,除了存储关键字之外,还需要一种方法来创建关键字之间的关系。

我们说我有种子关键字和相对关键字

示例:

种子关键字: Car

相对关键字: Blue CarRed CarConvertible Car2 doors4 doors

在另一次互动中,

种子关键字: Convertible Cars

相对关键字: FerrariMustang2 doors

然后,当用户搜索关键字Car时,我需要显示最多2个深层的相关关键字。

-Car
-- Blue Car
-- Red Car
-- Convertible Car
---- Ferrari
---- Mustang

Keywords

+----+---------------+
| id | keyword       |
+----+---------------+
|  1 | Car
|  2 | Blue Car
|  3 | Convertible Car
|  4 | Ferrari
|  5 | Mustang
|  6 | Red Car
+----+---------------+

我在考虑使用Proxy表来存储关键字之间的关系

Relationship

+----+----------+-----------+
| id | seed_id | related_id |
+----+----------+-----------+
|  1 | 1        | 3
|  2 | 3        | 4
|  3 | 3        | 5
|  4 | 3        | 6
|  5 | 1        | 2
+----+----------+-----------+

最后,使用LEFT / JOINS创建正确的查询。

考虑到关键字表可能包含数亿行,您如何看待这种方法?

另一个想法就是保留关键字表并添加一个parent_id字段,但在这种情况下,我将有重复的关键字,我的优先级是每个关键字都有一行,以便不会获得一个时髦的大表。

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题是,一个关键字可以有多少关系?如果它接近父子关系,这意味着一个项只有一个父项,但可以有很多子项,那么最好使用这样的结构:

+----+---------------------+-------------+ | id | keyword | parent_id | +----+---------------------+-------------+ | 1 | Car | 0 | | 2 | Blue Car | 1 | | 3 | Convertible Car | 1 | | 6 | Red Car | 1 | | 6 | Mustang | 3 | | 6 | Ferrari | 3 | +----+---------------------+-------------+ 简单的左连接同一个表将帮助你。