假设一个名为 diary 的表有10列:
|id |date|cl2|cl3|cl4|cl5|cl6|cl7|cl8|activity|
|---|----|---|---|---|---|---|---|---|--------|
一个名为活动的表:
|activity_id|activity_name|
|-----------|-------------|
活动表列出了活动,例如{id:1,name:Reading},{id:2,name:Sports}等。 dairy 表包含日记输入,可以是一个一天,几天或一天几天。每个日记条目都可以标记多个活动。
还假设表日记拥有大约1000万个条目并且正在增长。关于考虑优化数据库的方法的时间。
可以通过任何值搜索日记条目,包括标记的活动。即,应该可以查找日志条目,其中activity_id 1 被标记。
这个环境中最好的结构是什么,能够最快速地写入,搜索,编辑和删除日记条目?此外,数据库大小是一个问题,虽然不是一个直接的问题。但在作出决定时应该权衡。
我现在有三种选择:
|id |date |diary_id|cl3|cl4|cl5|cl6|cl7|cl8|activity|
|---|------|--------|---|---|---|---|---|---|--------|
|1 |1-9-17|001 |xxx|xxx|xxx|xxx|xxx|xxx|1 |
|2 |1-9-17|001 |xxx|xxx|xxx|xxx|xxx|xxx|2 |
|3 |1-9-17|001 |xxx|xxx|xxx|xxx|xxx|xxx|5 |
为标记的活动创建单独的表:
Table: *acitivity_tags*
|id |diary_id|activity_id|
|---|--------|-----------|
|1 |001 |1 |
|2 |001 |2 |
|3 |001 |5 |
将标记的活动存储为逗号分隔的字符串,并使用find_in_set
查找已标记的活动:
|id |date |diary_id|cl3|cl4|cl5|cl6|cl7|cl8|activity|
|---|------|--------|---|---|---|---|---|---|--------|
|1 |1-9-17|001 |xxx|xxx|xxx|xxx|xxx|xxx|1,2,5 |
那么,实现这个目标的最有时间和空间效率的方法是什么?
答案 0 :(得分:0)
我更喜欢选项2,因为它遵循数据库规范化的规则。在选项1中,您重复其他列中的所有数据,这是浪费空间。您在选项3中遇到了性能问题,因为搜索CSV字段不会有效。如果外键上有正确的外键和索引,那么选项2的性能就可以了。