MySQL:单个单元格中的更多行或更多逗号分隔的项目

时间:2017-08-31 04:53:20

标签: mysql database

假设一个名为 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 被标记。

这个环境中最好的结构是什么,能够最快速地写入,搜索,编辑和删除日记条目?此外,数据库大小是一个问题,虽然不是一个直接的问题。但在作出决定时应该权衡。

我现在有三种选择:

  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       |
    
  2. 为标记的活动创建单独的表:

    Table: *acitivity_tags*

    
    |id |diary_id|activity_id|
    |---|--------|-----------|
    |1  |001     |1          |
    |2  |001     |2          |
    |3  |001     |5          |
    

  3. 将标记的活动存储为逗号分隔的字符串,并使用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   |
    

  4. 那么,实现这个目标的最有时间和空间效率的方法是什么?

1 个答案:

答案 0 :(得分:0)

我更喜欢选项2,因为它遵循数据库规范化的规则。在选项1中,您重复其他列中的所有数据,这是浪费空间。您在选项3中遇到了性能问题,因为搜索CSV字段不会有效。如果外键上有正确的外键和索引,那么选项2的性能就可以了。