首页 > 解决方案 > 词典网站的数据库设计

问题描述

对于一个单语词典,大约有 10k 个单词,其中一些单词重复但含义不同,使用单表设计可以吗?

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| word       | varchar(128) | NO   |     | NULL    |                |
| definition | varchar(500) | NO   |     | NULL    |                |
| example    | text         | NO   |     | NULL    |                |
| date       | datetime     | NO   |     | NULL    |                |
| votes      | int(4)       | NO   |     | 0       |                |
| name       | varchar(30)  | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

我使用的示例查询:

SELECT * FROM definitions WHERE word = ? ORDER BY votes DESC LIMIT 10
SELECT word, definition FROM definitions ORDER BY date DESC LIMIT 4
SELECT DISTINCT word FROM definitions WHERE word LIKE ? LIMIT 100

每次有人投票时,投票行也会更新。

有一个一对多的设计会更好吗?我的主要目标是性能。

标签: mysqlsqldatabasedatabase-design

解决方案


对于只有 10K 字(或者您的意思是行)和这些查询,性能将“足够好”。但是,这些是必需的:

INDEX(date)
INDEX(word, votes)

提示.. 如果经常出现新定义,则ORDER BY votes DESC LIMIT 10往往不会显示它们(当超过 10 个时)。因此,您可能应该有一些公式,其中涉及添加定义的日期和投票数。它可能是类似votes / TIMESTAMPDIFF(DAY, date, NOW())或缓和它的东西:(votes + 1) / DATEDIFF(DAY, date, NOW() + INTERVAL 2 DAY)。那将进入ORDER BY.


推荐阅读