2014-08-29 21 views
0

我正在为我的项目规划一个新的数据库结构,现在我正在考虑将数据存储在json字段中,而不是创建一些连接的表。MySQL + PHP:将数据存储为JSON vs连接

我知道,我不应该将数据存储到json字段中,我想在WHERE,ORDER BY或类似的命令中使用它。但是关于简单的1:n文本数据呢?

例如:

Table: cities 
--------------- 
id   int 
name  string 
districts string (JSON-Decoded PHP-Array) 

VS

Table: cities 
--------------- 
id   int 
name  string 

Table: districts 
--------------- 
id   int 
city_id  int  FK to Table cities 
name  string 

这只是一个简单的例子,但可以有更复杂的结构,如:

Table: cities 
--------------- 
id   int 
name  string 
data  string (JSON-Decoded PHP-Array) 

// Where data is a json-decoded PHP-Array like this: 
$city_1["data"] = array(
    "districts"  => array(1 => "East District", 2 => "West District"), 
    "special_text1" => "This text exists only in 10% of the cities", 
    "special_text2" => "This text exists only in 1% of the cities" 
); 
$city_2["data"] = array(
    "districts"  => array(1 => "South District", 2 => "West District", 3 => "Northern"), 
    "special_text1" => "This text exists only in 10% of the cities", 
); 

所以我的问题是:使用json解码的字段是否存在问题,例如由于性能等原因?

+0

号如果目的是 - 与实体的作用和在不同的东西,然后序列化(与存储为JSON) - 是最糟糕的架构错误,你可以在一个使。 – 2014-08-29 10:14:06

+0

我真的不明白这个问题。你将把JSON保存到''区域'列,但你想用它做什么?使用MySQL根据该列中的数据进行搜索/过滤? – 2014-08-29 10:14:24

回答

0

在文本列中保存JSON数据不是很好的解决方案,当你想对这些数据进行查询时。

PostgreSQL在其列JSON type上启用更多功能。

为了您的目的,最好使用MongoDB,其中JSON是存储数据的本地方式,它是无模式的,可以保存复杂的结构。您还可以轻松地在其中搜索数据,这在JSON数据库中保存为文本时是不可能的。在蒙戈您的数据可能是这样的:

{ 
    _id: <ObjectId>, 
    name: "City Name", 
    data: { 
     "districts": [ 
      { 
       id: 1, 
       name: "East District", 
       population: 12221, 
       ... 
      }, 
      { 
       id: 2, 
       name: "West District", 
       ... 
      } 
     ], 
     "special_text1" : "This text exists only in 10% of the cities", 
     "special_text2" : "This text exists only in 1% of the cities", 
     ... 
    }, 
    ... 
} 
+0

正如我所说的,我只想存储数据,我不想在这些json字段中查询。在我的情况下,MongoDB不是一个解决方案,因为其他数据需要在MySQL中。我有大约15个表,其中80%的字段是“经典”的mysql colmns和json字段,我只是想要存储数据,这些数据将存放在列中,其中90%的情况下将存储空值。我只想防止无用的列或为它们创建自己的表格 – bernhardh 2014-08-29 11:55:48

+1

如果您不需要查询此列,并且您确定将来不需要这样做,请将其存储为JSON或序列化数组,但我不要推荐它。根据城市创建自己的数据表将是更好的解决方案。 – 2014-08-29 12:58:43