Orm 对象关系映射问题:需要建议

Orm 对象关系映射问题:需要建议,orm,Orm,我一直在试图想出一个好的设计模式,将关系数据库中包含的数据映射到我创建的业务对象,但我一直遇到困难 考虑下表: TYPE: typeid, description USER: userid, username, usertypeid->TYPE.typeid, imageid->IMAGE.imageid IMAGE: imageid, location, imagetypeid->TYPE.typeid 我想收集有关特定用户的所有信息。为此创建查询并不太困难 SELECT

我一直在试图想出一个好的设计模式,将关系数据库中包含的数据映射到我创建的业务对象,但我一直遇到困难

考虑下表:

TYPE: typeid, description
USER: userid, username, usertypeid->TYPE.typeid, imageid->IMAGE.imageid
IMAGE: imageid, location, imagetypeid->TYPE.typeid
我想收集有关特定用户的所有信息。为此创建查询并不太困难

SELECT u.*, ut.*, i.*, it.* FROM user u
INNER JOIN type ut ON ut.typeid = u.usertypeid
INNER JOIN image i ON i.imageid = u.imageid
INNER JOIN type it ON it.typeid = i.imagetypeid
WHERE u.userid = @userid
问题是字段名发生冲突,然后我被迫为每个字段别名,这很快就会失控

有人对这种东西有像样的设计模式吗

我曾考虑过从一个存储过程中检索多个结果,然后使用数据集对每个结果进行迭代,但我担心一些性能问题可能会对我造成不利影响。例如,与上面的查询不同的是:

SELECT u.*, t.* FROM user u
INNER JOIN type t ON t.typeid = u.usertypeid
WHERE u.userid = @userid;
SELECT i.*, t.* FROM image i
INNER JOIN type t ON t.typeid = i.imagetypeid
INNER JOIN user u ON u.imageid = i.imageid
WHERE u.userid = @userid;

这似乎是一个体面的解决方案吗?有人能预见这种方法会有什么问题吗?

不要在生产代码中使用SQL
*
通配符。始终拼写出要检索的所有列

那么,对其中一些进行别名处理似乎并不是一项巨大的额外工作


如果您的评论询问背景和理由:

  • 有时并不需要所有表中的每一列,获取它们可能会花费不必要的成本(特别是对于大字符串和blob)。“除以下例外情况外,所有列”都没有SQL语法

  • 不能为使用通配符获取的列添加别名。一旦需要为任何列添加别名,就需要展开通配符以显式列出所有列

  • 如果表结构发生更改,例如列被重命名、重新排序、删除或添加,则通配符将按表中定义的位置获取所有列。这似乎是一种方便,但当应用程序依赖于结果集中给定名称或给定位置的列时,就不是这样了。如果应用程序以错误的顺序显示列(如果按位置引用列),或者将列显示为空白(如果按名称引用列),则可能会出现神秘的错误

    但是,如果SQL查询显式地命名列,则可以采用“Fail Early”原则。这有助于调试,因为它会直接引导您找到需要编辑以说明架构更改的SQL查询


简单地说,后一种解决方案似乎很糟糕。你不认为别名是一种更好的方法吗。顺便说一句,你真的在使用ORM框架吗?难道没有使用ORM框架吗?这是哪种语言的?你能给出一些背景和理由吗?谢谢