我已经看到这个问题得到了回答,但是在另一个例子中,它得到了一些建议以及必要的信息。我相信,我和其他人的背景完全不同。
我的目标是制作一种包含3种表类型的词典:
表1 :包含所有参赛作品的主词典
包含主键整数;英文单词;中文字;主题(即动物,食物等 - 这就是我想要为单个细胞提供多个条目的地方,因为有些单词对于多个主题是可行的);词性(动词,名词等); determininer boolean; determininer(如果boolean为true,它将包含一个字符串,如果为false,则它将具有null值);添加日期;难度等级
表2(组):根据主题,每个主题都有自己的表:动物,食物,测量等。
此表包含计数整数或表键;英文单词;中文字;它所属的词性;一个计数器(在我的申请中使用了多少次)。
表3(组):语音表的各个部分。每个表都将以其特定的语音分支命名。 nounProper,nounCommon,actionVerb等。
将包含整数键;英文单词;中文字
此数据库的目的是提供一个句子生成程序,该程序可以随着我的进展添加词汇表和主题表。在表1中,当我们跨越多个主题时,我是否应该在单元格中创建多个条目,或者我应该完全忽略它并简单地在查询中而不是在db表本身中组装表格?
答案 0 :(得分:0)
尝试一下这样的架构:
CREATE TABLE `words` (
`id` serial PRIMARY KEY,
`english` varchar(255) NOT NULL,
`chinese` varchar(255) NOT NULL CHARACTER SET utf8mb4,
`determiner` varchar(255),
`added` date NOT NULL,
`difficulty` tinyint unsigned NOT NULL DEFAULT 1
);
CREATE TABLE `topics` (
`id` serial PRIMARY KEY,
`topic` varchar(255) NOT NULL
);
CREATE TABLE `word_topics` (
`word_id` integer,
`topic_id` integer,
PRIMARY KEY (`word_id`, `topic_id`),
FOREIGN KEY (`word_id`) REFERENCES `words`(`id`),
FOREIGN KEY (`topics_id`) REFERENCES `topics`(`id`)
);
CREATE TABLE `parts_of_speech` (
`id` serial PRIMARY KEY,
`part_of_speech` varchar(255) NOT NULL
);
CREATE TABLE `word_pos` (
`word_id` integer,
`pos_id` integer,
PRIMARY KEY (`word_id`, `pos_id`),
FOREIGN KEY (`word_id`) REFERENCES `words`(`id`),
FOREIGN KEY (`pos_id`) REFERENCES `parts_of_speech`(`id`)
);
这样的查询:
SELECT `w`.*, `topic`, `part_of_speech`
FROM `words` AS `w`
LEFT JOIN `word_topics` AS `wt` ON `w`.`id` = `wt`.`word_id`
LEFT JOIN `topics` AS `t` ON `t`.`id` = `wt`.`topic_id`
LEFT JOIN `word_pos` AS `wp` ON `w`.`id` = `wp`.`word_id`
LEFT JOIN `parts_of_speech` AS `p` ON `t`.`id` = `wp`.`pos_id`
按主题获取随机词:
SELECT `w`.*, `topic`, `part_of_speech`
FROM `words` AS `w`
LEFT JOIN `word_topics` AS `wt` ON `w`.`id` = `wt`.`word_id`
LEFT JOIN `topics` AS `t` ON `t`.`id` = `wt`.`topic_id`
LEFT JOIN `word_pos` AS `wp` ON `w`.`id` = `wp`.`word_id`
LEFT JOIN `parts_of_speech` AS `p` ON `t`.`id` = `wp`.`pos_id`
WHERE `wt`.`topic_id` = ?
ORDER BY random()
LIMIT 1
您还可以使用WHERE
/ AND
关键字(替换或)为OR
子句添加其他条件...