mysql - 词典网站的数据库设计
问题描述
对于一个单语词典,大约有 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
每次有人投票时,投票行也会更新。
有一个一对多的设计会更好吗?我的主要目标是性能。
解决方案
对于只有 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
.