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查询