我正在开发一个系统,其目标是创建一个大型数据库来存储关键字(我确实有一个剪贴板来获取这些关键字)。
我使用分区来加速查询,这是我的初始结构:
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 Car
,Red Car
,Convertible Car
,2 doors
,4 doors
在另一次互动中,
种子关键字: Convertible Cars
相对关键字: Ferrari
,Mustang
,2 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字段,但在这种情况下,我将有重复的关键字,我的优先级是每个关键字都有一行,以便不会获得一个时髦的大表。
提前致谢。
答案 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 |
+----+---------------------+-------------+
简单的左连接同一个表将帮助你。