是否可以在Oracle数据库中使用JSON字符串进行关系

时间:2015-04-22 17:56:10

标签: json database oracle database-performance

前段时间我加入了Oracle(11.2)数据库项目。 JSON字符串在其中大量用于关系数据:

  1. 不使用单独的表用于多对多关系,而是使用JSON字符串。例如:假设我们有学生和讲座表。在我们的架构中,学生表将有“讲座”栏目。它将包含带有讲座名称的JSON数组(甚至不是讲座ID,而是名称)。但是对于一对多的关系,使用其他的表ID而不是JSON。
  2. 通常整个对象存储在JSON列中,而不是单独的表中。因此,对于学生,您可以拥有等级列,其中您有JSON,如{等级:'A',日期:'2015-01-01',讲座:'数学分析'}
  3. 使用MicroOrm检索
  4. 对象,并在C#代码中解析这些JSON,以便JSON字符串成为简单对象的列表。对于每个JSON列,我们都有这样的代码:
  5. private string _lecturesJson; public string LecturesJson { get { return Lectures.ToJson(); } set { _lecturesJson = value; Lectures = value.FromJson<List<string>>(); } } public List<string> Lectures { get; set; }

    整个架构以某种方式混合了关系和文档数据库范例。我试图说服建筑师这样的解决方案很糟糕,但他坚持认为这种架构非常现在。我同意文档数据库世界中有很多事情发生。但这完全不同,不是吗?在我看来,至少有几个原因导致它变坏:

    1. 搜索性能将是灾难性的。 E.I.计算所有学生的数学分析平均成绩。您必须阅读/填充所有这些JSON值。
    2. 您无法在JSON密钥上设置索引
    3. 您无法在JSON密钥上设置主键或外键等约束 - 数据一致性受到威胁。实际上对于大多数表来说,根本没有设置主键或外键(我的意思是那些一对多的表,其中数据通过普通Id链接),
    4. 数据库大小比它需要的大 - 我们存储其他对象的名称,这是多余的 - 如果引用的对象名被修改了怎么办?看来我们必须遍历所有JSON字符串并更新这些名称(正如我所写,我们使用名称而不是ID来链接数据)。
    5. 应用程序本身应针对数据查询进行优化,因为大多数时候都会使用搜索和数据导出。

      我是对的吗?这是完全错误还是有一些我不知道的趋势?这个体系结构错误还有其他原因吗?

4 个答案:

答案 0 :(得分:2)

你是对的。

您可以在关系数据库中存储clobs / blob。这并不意味着使用关系数据库,因为doc存储是一种趋势,更多的是反模式

如果您需要doc商店,请尝试使用Mongo或OrientDB。

如果您需要跨多个JSON加入数据,这将非常低效,将数据放在字段中意味着您可以加入任何列。这也意味着你需要了解数据建模的人。

如果你需要在JSON中提取数据,最好是制作存储过程,或者更好的是从表中提供JSON的REST API,那么你可以灵活地提供任何其他表示而不会影响你的模型。 ..但是根据你的描述,听起来你甚至不需要json。

答案 1 :(得分:1)

“整个架构以某种方式混合了关系和文档数据库范例。” - 你是对的。完全可以以这种方式使用关系数据库。当您仅搜索并使用JSON时,它是完全合理的:全部或全部。您使用主键键入它,而不是内部的值。

如果你确实需要在里面搜索一组有限的值,那么完全可以在这些值上添加一些额外的列和索引。您的搜索问题很容易解决。

至于数据库大小 - 除非你在谈论太字节或数PB的信息,我认为这种担忧被夸大了。无论如何,您应该按日期对事务数据进行分区,并将旧分区移出到历史数据库。如果数据库中有多年的事务数据,则会出现另一个问题。

答案 2 :(得分:0)

Oracle 12c本身支持JSON,请查看here

感谢。

答案 3 :(得分:0)

你可以使用任何东西,但你的最佳做法是密钥应该只在GUID字段上。在规范化的数据库中,您通常会加入这些密钥。

如果您确实需要匹配整个文档,请在插入时生成文档的哈希并索引该哈希值。你可以加入哈希,它会更有效率。

也就是说,如果您要存储整个JSON,可能需要查看mongo或其他文档存储。