我一直在努力想出一个好的设计模式,用于将关系数据库中包含的数据映射到我创建的业务对象中,但我不断碰壁。
考虑以下表格:
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;
这看起来像是一个不错的解决方案吗?任何人都可以预见到这种方法的任何问题吗?
答案 0 :(得分:3)
切勿在生产代码中使用SQL *
通配符。始终拼出您要检索的所有列。
然后别名中的一些似乎不是那么多额外的工作。
请你的评论询问背景和推理:
有时您并不需要所有表中的每个列,并且获取它们可能会花费不必要的代价(特别是对于大字符串和blob)。 “除以下异常外的所有列都没有SQL语法。”
您无法为使用通配符获取的列设置别名。一旦需要为任何列设置别名,就需要展开通配符以明确列出所有列。
如果表格结构发生变化,例如重命名,重新排序,删除或添加列,然后通配符按表中定义的位置获取所有列。这可能看起来很方便,但是当您的应用程序依赖于给定名称或给定位置的结果集中的列时。你可以得到一个神秘的错误,你的应用程序以错误的顺序显示列(如果按位置引用列),或者将它们显示为空白(如果按名称引用列)。
但是,如果SQL查询明确指定列,则可以使用“早期失败”原则。这有助于调试,因为它会直接引导您进行需要编辑的SQL查询以解决架构更改问题。