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

时间:2009-01-08 07:04:01

标签: orm

我一直在努力想出一个好的设计模式,用于将关系数据库中包含的数据映射到我创建的业务对象中,但我不断碰壁。

考虑以下表格:

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;

这看起来像是一个不错的解决方案吗?任何人都可以预见到这种方法的任何问题吗?

1 个答案:

答案 0 :(得分:3)

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

然后别名中的一些似乎不是那么多额外的工作。


请你的评论询问背景和推理:

  • 有时您并不需要所有表中的每个列,并且获取它们可能会花费不必要的代价(特别是对于大字符串和blob)。 “除以下异常外的所有列都没有SQL语法。”

  • 您无法为使用通配符获取的列设置别名。一旦需要为任何列设置别名,就需要展开通配符以明确列出所有列。

  • 如果表格结构发生变化,例如重命名,重新排序,删除或添加列,然后通配符按表中定义的位置获取所有列。这可能看起来很方便,但是当您的应用程序依赖于给定名称或给定位置的结果集中的列时。你可以得到一个神秘的错误,你的应用程序以错误的顺序显示列(如果按位置引用列),或者将它们显示为空白(如果按名称引用列)。

    但是,如果SQL查询明确指定列,则可以使用“早期失败”原则。这有助于调试,因为它会直接引导您进行需要编辑的SQL查询以解决架构更改问题。