从关系数据库中展平数据模型的最快方法

时间:2013-07-03 15:53:11

标签: database performance rest data-modeling

我目前正在开发一个以简单层次结构存储数据的应用程序。该模型与此类似(用类似C#的语法表示):

class Box {
    int Id { get; set; }
}

class Gadget {
    int Id { get; set; }
    int ParentBox { get; set; }
}

所以,我有几千个盒子,我有零个或多个小工具属于一个盒子。为了访问数据,我创建了一个小型REST API,允许我查询所有框或其中的一部分。通过API的响应是一个数据传输对象,它包含属于该框的所有小工具。典型的JSON答案是:

{ "Boxes": [
    { "Id: 1,
      "Gadgets": [
        { "Id": 100 }
        { "Id": 101 }
      ]
    },
    { "Id: 2,
      "Gadgets": [
        { "Id": 200 }
        { "Id": 201 }
      ]
    }
}

不幸的是,结果表明性能很糟糕。获取数据的逻辑(再次,使用类似C#的语法):

var boxes = Db.Select<Boxes>();

foreach (var box in boxes) {
  var boxDto = new BoxDto();
  boxDto.Gadgets = ConvertToDto(Db.Select<Gadget>().Where(q => q.Box == box.Id));
}

我知道我的解决方案很天真。我有成千上万个盒子,每个盒子里有几十个小工具。我的问题是:

  • 是否有任何模式可以有效地管理这些关系?我不能成为第一个遇到这个问题的人,但我没有在网上找到任何东西。
  • 我应该更改数据模型吗?如果是这样,怎么样?

任何想法/反馈都将不胜感激。

1 个答案:

答案 0 :(得分:0)

一种可能性是假设您使用的是SQL Server,您可以编写一个输出XML的查询。这样,您可以加入数据库中的框和小工具,并返回具有所需层次结构的XML文件。

当您的应用程序获取XML时,将其转换为JSON是一个快速的过程。

或者,对于真的只是JSON,您可以在TSQL中进行字符串连接。基本上组成您自己的JSON并从存储过程返回它。如果层次结构很复杂,它会非常快速地变得非常讨厌。