JSON哲学

时间:2012-08-25 18:47:12

标签: json mongodb

我爱上并沉迷于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 个答案:

答案 0 :(得分:3)

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

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

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

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

谈到Mongo甚至Javascript的灵活性......我喜欢灵活性。它使我们能够有效地解决其他工具集中更难解决的问题。但是,如果要提高代码效率并简化调试,那么就需要尽可能地调整灵活性。

答案 1 :(得分:2)

嗯,这取决于。

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

以上对于XML来说是正确的。由于JSON主要是关于序列化,因此您可以选择最容易使用的。您将处理数据,并且您最了解深层嵌套结构是否存在问题。

答案 2 :(得分:1)

从我的角度来看,你面临着类似的困境,所有开发人员都试图设计类设计/ XML设计/ SQL模式设计:)

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

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

您还应该记住的是:

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

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

答案 3 :(得分: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",
             }
        }
    }
}

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