从关系数据库映射

Posted

技术标签:

【中文标题】从关系数据库映射【英文标题】:Mapping from relational database 【发布时间】:2011-11-05 16:25:22 【问题描述】:

对于一对一的关系,事情很容易。 当涉及到一对多或多对多的问题出现... 由于多种原因,我现在没有使用 ORM 工具,我想知道何时我想获取数据是否更好地使用多个查询或在代码中重新组合一对多关系..

例如.. 有一个类 Category 和一个类 Product...

产品表有一个类别 ID 列(一个类别很多产品)。

因此,对于我的完整目录,执行 2 个查询以获取我想要的类别和产品,然后为每个类别填充其产品列表是否更好? (使用 LINQ 很容易)..

或者我应该为每个类别调用查询?赞select id from products where category_id=5;

我也不知道如何命名函数,比如设置我是否要获取关系的另一端..

【问题讨论】:

【参考方案1】:

您应该始终使用尽可能少的查询来检索您的数据。为每个类别执行一个查询以加载产品被称为 N+1 问题,并且会很快导致代码出现瓶颈。

至于如何命名指定获取计划的方法,请以方法实际执行的操作命名,例如 IncludeProducts 或 WithProducts。

【讨论】:

【参考方案2】:

如果要检索所有类别及其所有产品,您可以选择所有类别,然后在两个查询中选择所有产品,也可以在一个查询和组中选择。

要仅使用一个查询,请为两个表选择一个内连接

SELECT c.*, p.* 
FROM Category c INNER JOIN Product p ON c.CategoryId = p.CategoryId

然后从结果数据集中构造业务对象

result.GroupBy(r => r.CategoryId).Select(group =>
    new Category(/* new Category using c.* columns */)
     
        Products = /* new list of Products from p.* values */
    );

但我不得不问 - 你为什么不使用 ORM?

【讨论】:

我没有时间学习 .NET 所需的学习曲线。我习惯了java ORM,但它们太复杂了。一个join查询不会造成太多重复数据吗? 会导致数据重复但查询量少。这取决于您从目录表中检索到多少列 - 有多少数据将与总数成比例地重复?如果这是一个问题,那么您应该对其进行基准测试。

以上是关于从关系数据库映射的主要内容,如果未能解决你的问题,请参考以下文章

mybatis--对象关系映射细节详解

关系数据库模式设计 - 如何直接从实体的字段集建模一对一映射

JPA映射关系

面试题思考:什么是 对象/关系 映射集成模块

一对多关系映射

映射生产数据库