【问题标题】:Storing associative array into database将关联数组存储到数据库中
【发布时间】:2021-12-15 13:32:04
【问题描述】:

我有 3 张桌子:

1- 问题 2-答案 3- user_answers

    questions
_________________
| id | question |
|____|__________|
| 1  |   1+1    |
|____|__________|



    answers
_________________
| id |  answer  |  
|____|__________|
| 1  |    1     | 
|____|__________|
| 2  |    3     |
|____|__________|
| 3  |    2     | 
|____|__________|

                 user_answers
______________________________________________
| id |  answer_id  |  question_id |   user_id |
|____|_____________|______________|___________|
| 1  |    1        |       1      |      1    |
|____|_____________|______________|___________|
| 2  |    3        |       2      |      1    |
|____|_____________|______________|___________|
| 3  |    2        |       3      |      1    |
|____|_____________|______________|___________|

如您所见,user_answers 表中存在多对多关系。

我不想将每个问题及其答案连续保存,而是将所有问题和答案保存为一个数组。因此,每个用户将有 1 行用于性能。

我对此进行了搜索,发现 serialize() 函数并且该列的数据类型应该是 Blob

所以新表应该是这样的:

        user_answers
______________________________
|  id  |  array  |  user_id  |
|______|_________|___________|
|   1  |   Blob  |     1     |
|______|_________|___________|

数组可能是这样的:

$array = array(
    1 =>  1,
    2 =>  3,
    3 =>  2
);

可能会有 20 多个问题。

这是最好的方法吗?或连续保存每个问题?还是为array 列使用其他数据类型?

【问题讨论】:

  • 原来的方式是最好的方式。请参阅:Database normalization。如果您只想查看问题 14 的答案怎么办?
  • "for performance" 性能优势是什么,你做过一些测试吗?如果您想找出用户#1 对问题#2 的回答,怎么样?
  • 如果我想得到一个特定的问题,我会获取整行并得到那个。我也会像第一种方式一样得到 1 行
  • @brombeer 我没有做任何测试。但我认为这比为每个用户保存 20 行要好
  • 我认为您认为创建这么多行,为每个用户问题组合创建一个行,一定对性能不利,但事实并非如此。数据库是用来处理大量数据的。必须检索比实际需要更多的数据,然后必须对其进行处理,然后才能使用它,对性能不利。

标签: php mysql performance blob


【解决方案1】:

每个用户 1 行用于性能

这可能会适得其反。

如果您通过序列化、JSON 等将一堆东西打包在一起,您需要避免查看这些东西。也就是说,唯一实用且有效的做法是将整个字符串提取到您的应用程序中并在那里将其分解。

如果您可能需要获取“每个用户仅针对问题 3 给出的答案”,那么 question number 需要成为自己的列。

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多