我正在创建我的技术 wiki 站点的第二个版本,我想要改进的一件事是数据库设计。问题(或者我认为)是为了显示每个文档,我需要加入 15 个以上的表。我有一堆查找表,其中包含与每个 wiki 条目相关的描述性数据,例如使用的程序员、cpu、标签、外围设备、PCB 布局软件、难度级别等。
下面是一个布局示例:
doc
--------------
id | author_id | doc_type_id .....
1 | 8 | 1
2 | 11 | 3
3 | 13 | 3
_
lookup_programmer
--------------
doc_id | programmer_id
1 | 1
1 | 3
2 | 2
_
programmer
--------------
programmer_id | programmer
1 | USBtinyISP
2 | PICkit
3 | .....
由于某些文档 ID 可能具有单个属性(例如程序员)的多个条目,因此我创建了数据库来弥补这一点。programmer
其他 10 个属性的布局与上面的 2 个表格类似。要显示单个文档文章,需要连接大约 20 个表。
我使用 Sphinx 搜索引擎来查找具有某些特征的文章。本质上,Sphinx 索引所有数据(不存储)并根据提供的过滤器返回感兴趣的 wiki 文档 ID。如果我想找到使用某个程序员的文章然后按日期排序,MYSQL 必须先将所有文档与 2 个程序员表连接,然后过滤,最后按插入时间对剩余的文档进行排序。没有索引可以帮助我对过滤结果进行排序(150k 文档 ID 需要很长时间),因为它是在临时表中完成的。可以想象,随着需要过滤的参数越多,情况会变得更糟。
这是因为我必须依靠 Sphinx 才能返回 - 比如说所有使用特定 CPU 和程序员的 wiki 条目 - 这让我相信我当前的设置存在 DB 气味......
编辑:看起来我已经实现了[实体-属性-值模型] 1