MySQL + PHP:将数据存储为JSON与连接

时间:2014-08-29 10:08:57

标签: php mysql

我正在为我的项目规划一个新的数据库结构,现在我正在考虑将数据存储在json-field中,而不是创建一些连接表。

我知道,我不应该将数据存储到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解码字段是否存在问题,例如因为性能等问题?

1 个答案:

答案 0 :(得分:0)

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

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

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

{
    _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",
        ...
    },
    ...
}