在Oracle数据库中对关系使用JSON字符串可以吗

在Oracle数据库中对关系使用JSON字符串可以吗,json,database,oracle,database-performance,Json,Database,Oracle,Database Performance,不久前,我参加了一个Oracle(11.2)数据库项目。JSON字符串在其中大量用于关系数据: 对于多对多关系,不使用单独的表,而是使用JSON字符串。例如:假设我们有学生桌和讲课桌。在我们的建筑学学生表中将有“讲座”栏。它将包含带有讲座名称的JSON数组(甚至不是讲座ID,而是名称)。但是,对于一对多关系,使用另一个表ID而不是JSON 通常,整个对象存储在JSON列中,而不是单独的表中。所以,对于学生来说,你们可以在“成绩”栏中加入JSON,比如{成绩:'A',日期:'2015-01-01'

不久前,我参加了一个Oracle(11.2)数据库项目。JSON字符串在其中大量用于关系数据:

  • 对于多对多关系,不使用单独的表,而是使用JSON字符串。例如:假设我们有学生桌和讲课桌。在我们的建筑学学生表中将有“讲座”栏。它将包含带有讲座名称的JSON数组(甚至不是讲座ID,而是名称)。但是,对于一对多关系,使用另一个表ID而不是JSON
  • 通常,整个对象存储在JSON列中,而不是单独的表中。所以,对于学生来说,你们可以在“成绩”栏中加入JSON,比如{成绩:'A',日期:'2015-01-01',讲座:'数学分析'}
  • 使用MicroOrm检索对象,并在C#代码中解析这些JSON,因此JSON字符串成为简单对象的列表。对于每个JSON列,我们都有如下代码:
  • 
    私有字符串_teachesjson;
    公共字符串JSON
    {
    获取{return.ToJson();}
    设置{u讲师JSON=value;讲师=value.FromJson();}
    }
    公共列表{get;set;}


    整个体系结构以某种方式混合了关系数据库和文档数据库范例。我试图让架构师相信这样的解决方案是不好的,但他坚持认为这样的架构在当今非常流行。我同意在文档数据库的世界里有很多事情要做。但这完全不同,不是吗?在我看来,至少有几个原因可以解释为什么它不好:

  • 搜索性能将是灾难性的。计算所有学生数学分析的平均分数。您必须读取/pase所有这些JSON值
  • 不能在JSON键上设置索引
  • 不能在JSON键上设置主键或外键等约束-数据一致性受到威胁。实际上,对于大多数表,根本没有设置主键或外键(我指的是那些一对多表,其中数据通过普通Id链接)
  • 数据库大小超出了它的需要-我们正在存储其他对象的名称,这是多余的-如果引用的对象名称被修改了怎么办?似乎我们必须遍历所有JSON字符串并更新这些名称(正如我写的那样,我们使用名称而不是ID来链接数据)
  • 应用程序本身应该针对数据查询进行优化,因为大部分时间都使用搜索和数据导出

    我说得对吗?这是完全错误的,还是我不知道有什么趋势?这个体系结构出错还有其他原因吗?

    “整个体系结构在某种程度上混合了关系数据库和文档数据库范例。”-是的,你是对的。完全可以用这种方式使用关系数据库。当您只搜索和使用JSON的全部内容时,这是非常有意义的:全部或无。您可以使用主键对其进行键控,而不是对其内部的值进行键控

    如果您确实需要搜索内部有限的一组值,那么完全可以添加一些额外的列并对这些列进行索引。您的搜索问题很容易解决

    至于数据库大小——除非你谈论的是TB或PB的信息,否则我认为这种担心是言过其实的。无论如何,您应该按日期对事务数据进行分区,并将旧分区移到历史数据库中。如果数据库中存在多年的事务数据,则会出现另一个问题。

    您是正确的

    您可以将CLOB/BLOB存储在关系数据库中。这并不意味着使用关系数据库作为文档存储是一种趋势,更像是一种反模式

    如果您需要文档存储,请尝试Mongo或OrientDB

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


    如果您需要以JSON格式提取数据,最好是制作一个存储的proc,或者更好的是使用RESTAPI从表中提供JSON,那么您就可以灵活地提供任何其他表示,而不会影响您的模型。。。。但是从您的描述来看,听起来您甚至不需要json

    Oracle 12c本机支持JSON,请看一看


    谢谢。

    您可以使用任何东西,但您的最佳实践是,键实际上应该仅位于GUID字段上。在规范化良好的数据库中,您通常会在这些键上进行连接

    如果您确实需要匹配整个文档,请在插入时生成文档的散列,并为该散列编制索引。你可以加入散列,这样会更有效率


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

    通常我们必须通过JSON的内容查询数据库-主要是在搜索中。您好,您的答案似乎有点离题:问题不是“如何”,而是“是否正确”。