gpt4 book ai didi

json - 可以在 Oracle 数据库中使用 JSON 字符串作为关系吗

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:48 25 4
gpt4 key购买 nike

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

  1. 不是为多对多关系使用单独的表,而是使用 JSON 字符串。例如:假设我们有 Student 和 Lecture 表。在我们的架构学生表中将有“讲座”列。它将包含带有讲座名称的 JSON 数组(甚至不是讲座 ID,而是名称)。但是,对于一对多关系,使用其他表 ID 而不是 JSON。
  2. 通常整个对象存储在 JSON 列中,而不是单独的表中。所以对于 Student 你可以有 Grades 列,其中你有像 { Grade: 'A', Date: '2015-01-01', Lecture: 'Mathematical Analysis'}
  3. 这样的 JSON
  4. 使用 MicroOrm 检索对象,并在 C# 代码中解析这些 JSON,因此 JSON 字符串成为简单对象的列表。对于每个 JSON 列,我们都有这样的代码:


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 来链接数据)。

应用程序本身应该针对数据查询进行优化,因为大部分时间都使用搜索和数据导出。

我说的对吗?这是完全错误的,还是有一些我不知道的趋势?是否还有其他原因导致此架构错误?

最佳答案

你是对的。

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

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

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

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

关于json - 可以在 Oracle 数据库中使用 JSON 字符串作为关系吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com