【发布时间】:2011-01-31 12:50:37
【问题描述】:
这是一个“理论”问题。
我在定义问题时遇到了麻烦,请多多包涵。
当您在数据库中有多个相关表时,例如一个包含“用户”的表和一个包含“电话”的表
“phones”和“users”都有一个名为“user_id”的列
select user_id,name,phone from users left outer join phones on phones.user_id = users.user_id;
查询将为我提供所有用户的行,无论他们是否有电话。
如果用户有多部手机,他的姓名将按预期分两行返回。
columns=>|user_id|name|phone|
row0 = > | 0 |fred|NULL|
row1 = > | 1 |paul|tlf1|
row2 = > | 1 |paul|tlf2|
在上面的例子中,名字“paul”是一个必要的复制品,在 RDMS 的眼里根本不是复制品! 然后它将由一些服务器端脚本语言处理,例如 php。
在真实的网站或应用程序中,这些“必要的重复”实际上是如何处理的? 如,该行是如何“映射”到一些可用的对象模型中的。
附言如果您决定发布示例,请尽可能为 php、mysql、sqlite 发布示例。
编辑:
感谢您提供答案,每个答案对问题的解释都不同,因此以自己的方式不同且正确。
我得出的结论是,如果往返费用昂贵,那么这将是最好的方式以及 Jakob Nilsson-Ehle 的解决方案,该解决方案适合理论问题。
如果往返价格便宜,我将按照 9000 的建议为手机和用户分别选择,如果我需要为每个用户显示一部手机,我将为手机提供一个主列并与用户一起加入像 Ollie Jones 正确建议的那样选择。
即使对于现实生活中的应用程序,我使用的是 9000 的答案,但我认为对于这个不切实际的问题,Jakob Nilsson-Ehle 的解决方案是最合适的。
【问题讨论】:
-
你应该让“user_id”列进入输出,因为这样你就可以明确地识别用户(即区分 [23,paul] 和 [17,paul])。
-
不是重复的列而是行。列 >,行 v.
-
@Martinho Fernandes 是的,显然,添加它是为了“正确”:) @M3t0r 在上面的示例中没有重复的行。
-
您对什么问题感兴趣:将其映射到对象模型的问题,还是从 DB 传输过多数据的问题?
-
@Martinho Fernandes “映射到对象模型”,谢谢。 (不知道这是怎么称呼的)