3

我爱上了 JSON 并且痴迷于 JSON。我正在使用 node.js 和 mongodb,我在两种不同的哲学之间左右为难。

1

{
    "app":{
        "keys":{
            "facebook":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
            "twitter":{
                "apikey":"3241bly5vlv1l2hjv51",
                "sharedsecret":"gxdz1n25f1m235xm1235",
            }
        }
    }
}

2

{
    "app":{
        "keys":{
            "facebook_apikey":"1412v5l1v5jv5j1h2v5",
            "facebook_sharedsecret":"v5j12hv51hc4v123vmnv",
            "twitter_apikey":"3241bly5vlv1l2hjv51",
            "twitter_sharedsecret":"gxdz1n25f1m235xm1235",
        }
    }
}

3个甚至

{
    "app":{
        "facebook_apikey":"1412v5l1v5jv5j1h2v5",
        "facebook_sharedsecret":"v5j12hv51hc4v123vmnv",
        "twitter_apikey":"3241bly5vlv1l2hjv51",
        "twitter_sharedsecret":"gxdz1n25f1m235xm1235",
    }
}

使数据更加复杂

{
    "app":{
        "keys":{
            "facebook":{
                "production":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",                  
                },
                "development":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",                  
                },
            },
            "twitter":{
                "production":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",                  
                },
                "development":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",                  
                },
            }
        }
    }
}

或者

{
    "app":{
        "keys":{
            "production":{
                "facebook":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                },
                "twitter":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                },
            },
            "development":{
                "facebook":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                },
                "twitter":{
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                },
            },
        }
    }
}

你应该去多深?有没有太远或太远的东西?

4

4 回答 4

3

我会使用以下内容,实际上确实使用了与以下内容非常相似的内容:

{
    "app":{
        "production":{
            "facebook":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
            "twitter":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
        },
        "development":{
            "facebook":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
            "twitter":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
        }
    }
}

当我设计一个系统时,我希望创建处理多种不同情况的通用代码。这通常意味着在设计中创建一致性。

以上允许您创建一个查找“应用程序”的例程,然后选择一个操作环境,“生产”或“开发”。然后可以将其交给另一个功能,并要求找到您关心的特定服务,无论是“facebook”、“twitter”,还是像“foursquare”这样的新服务。然后,单个 oAuth 函数集可以处理授权过程,无论传入的对象是什么,因为它将始终能够请求“apikey”和“sharesecret”,而不管正在使用哪个服务。

谈到 Mongo 甚至 Javascript 的灵活性……我喜欢这种灵活性。它使我们能够有效地解决在其他工具集中更困难的问题。但是,如果您要获得代码效率和易于调试,则需要尽可能多地保持一致性来调整这种灵活性。

于 2012-08-25T22:17:38.247 回答
2

嗯,这取决于。

从语义上看,如果您希望将更多应用程序添加到该列表中,#1 更正确。如果应用列表是固定的(即总是有两个),那么可以考虑# 2。但一般来说,你总是使用#1,因为它更干净。

以上对于 XML 来说是正确的。由于 JSON 主要与序列化有关,因此您选择最容易使用的一种。您将处理数据,并且您最清楚是否有深度嵌套结构的问题。

于 2012-08-25T18:53:46.420 回答
1

从我的角度来看,您面临着与所有开发人员类似的困境,他们尝试设计类设计/XML 设计/SQL 模式设计:)

根据我的经验,您基本上应该分组:

  • 什么对你有意义
  • 什么是合乎逻辑的
  • 并且易于扩展和维护。

您还应该记住的是:

  • 您如何访问/处理数据以及其背后的行为是什么。

我喜欢把事情结构化,对我来说是有意义的,所以我最有可能采用第一种方法。然而我的经验是,我使用数据的次数越多,我就越能看到优化其结构的方法。所以我会尽量让它为以后的重构做好准备。:)

于 2012-08-25T18:56:50.040 回答
1

这可能看起来很奇怪,但重点是 MongoDB,它允许您这样做:

{
    "app":{
            "facebook":{
                "keys" : {
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                }
            },
            "twitter":{
                "keys" : {
                    "apikey":"3241bly5vlv1l2hjv51",
                    "sharedsecret":"gxdz1n25f1m235xm1235",
                }
            }
        }
    }
}

为什么?

嗯,答案就是 NoSQL 数据库出现的原因:你不确定数据结构。考虑添加,例如routes字段"facebook"

            "facebook":{
                "keys" : {
                    "apikey":"1412v5l1v5jv5j1h2v5",
                    "sharedsecret":"v5j12hv51hc4v123vmnv",
                },
                "routes" : {
                     "mainroute" : "00.00.server.xx1",
                     "subroute" : "00.01.server.yy2",
                }
            },

并且该信息与推特无关,twitter因为 twitter 不支持假设的routes功能。

如果您拥有#1 中建议的集合,会发生什么?

{
    "app":{
        "keys":{
            "facebook":{
                "apikey":"1412v5l1v5jv5j1h2v5",
                "sharedsecret":"v5j12hv51hc4v123vmnv",
            },
            "twitter":{
                "apikey":"3241bly5vlv1l2hjv51",
                "sharedsecret":"gxdz1n25f1m235xm1235",
            }
        },

        "routes" : {
            "facebook" :    {
                "mainroute" : "00.00.server.xx1",
                "subroute" : "00.01.server.yy2",
             }
        }
    }
}

看起来有点多余,不是吗?

于 2012-08-25T19:05:40.887 回答