Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MYSQL中,将数据存储在多行还是只存储在一个json中更好?_Mysql_Json_Rdbms_Nosql - Fatal编程技术网

在MYSQL中,将数据存储在多行还是只存储在一个json中更好?

在MYSQL中,将数据存储在多行还是只存储在一个json中更好?,mysql,json,rdbms,nosql,Mysql,Json,Rdbms,Nosql,这方面的例子可以是用户和测试的题库。未来可能会出现很多关系 当用户在一个集合中尝试提问时,有多个随机数的问题。 因此,在提交该集合时,最好将特定集合的数据存储为json或多行 方法1 QuesTable id | ques id | username | setinfo id | ques id | username id | userid | setinfo id | ques id | username UserTable id | ques id | usernam

这方面的例子可以是用户和测试的题库。未来可能会出现很多关系

当用户在一个集合中尝试提问时,有多个随机数的问题。 因此,在提交该集合时,最好将特定集合的数据存储为json或多行

方法1

QuesTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
UserTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
其中,对于特定用户创建的任意数量的集合,setinfo可以存储为json, 当用户创建一个集合时,我们可以将数据附加到此json中

{
  "sets": [
    {
      "set1": [
        {
          "q1": {
            "given_answer": "a",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          },
          "q2": {
            "given_answer": "c",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          },
          "q3": {
            "given_answer": "b",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          }
        }
      ]
    },
    {
      "set2": [
        {
          "q1": {
            "given_answer": "a",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          },
          "q2": {
            "given_answer": "c",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          },
          "q3": {
            "given_answer": "b",
            "some_key1": "some_value1",
            "some_key2": "some_value2"
          }
        }
      ]
    }
  ]
}
方法2

它是相同的,但我们可以为集合信息创建另一个表,并将每个集合存储为自己的id

QuesTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
UserTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
用户设置表

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
在这里,每次用户创建一个集合时,它都会使用FK userid在user_set_info中创建一个新列 每个setinfo都在哪里

[
  {
    "q1": {
      "given_answer": "a",
      "some_key1": "some_value1",
      "some_key2": "some_value2"
    },
    "q2": {
      "given_answer": "c",
      "some_key1": "some_value1",
      "some_key2": "some_value2"
    },
    "q3": {
      "given_answer": "b",
      "some_key1": "some_value1",
      "some_key2": "some_value2"
    }
  }
]
方法3

QuesTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
UserTable

id | ques 
id | username | setinfo
id | ques 
id | username
id | userid | setinfo
id | ques 
id | username
用户设置信息

id | userid | quesid | given_ans | somekey1 | somekey2
这里的问题是,如果用户给出一个有100个问题的测试,那么它将创建100行,并且需要100个插入,那么查询可以是单个的


制作多行是个好主意吗?什么时候最好在mysql列中使用json,什么时候不是

你应该问自己的问题是:
-数据容易检索吗?
-数据是否易于更新?
-如果以后更改模型,数据的持久性如何

关系数据库回答这些问题时使用:
-选择
-更新
-更改和更新

在使用JSON存储时,您可能很难更改数据,从而大大降低数据库的耐久性,并使其更难维护


在做出关于数据存储的决定时,一定要考虑投票否决的理由。

不要过早地优化。对于关系数据库——如果信息不是“不透明块”,那么最好将其规范化。如果没有正确的规范化,就不可能编写可搜索查询或强制执行直接引用完整性。(一些RDBMS引擎允许JSON/XML的切分,但这是另一种可能。)此外,SQL中的列数应该是固定的(对于某些问题,这是一个例外,但同样:仅限高级使用),就像类的成员是固定的一样。SQL多样性跨行工作;这通常超出了SO问题的范围。