2013-05-21 34 views
1

我正在做一个相当简单的系统,用户可以通过按选项类型进行搜索来查找计算机。我想按品牌,型号和“选项”进行搜索。加入vs多选

基本上我有5台在此scenario-

  1. 品牌
  2. 模型
  3. 选择
  4. options_group
  5. 选项

选择表是多列查找表包含:

  • brand_id
  • MODEL_ID
  • options_group_id

的options_group表是与 “的选项组” 的ID和每个option_id的条目的查找表。

基本上,options_group表允许很多条目具有相同的选项组,而不会多次存储它。

对。所以。我想选择部分的特定选择,其产生的表:

  • 品牌
  • 模型
  • 选项

其中“选项”是基于关闭options_group产生。

我的问题是这样的:我是否用多选择语句,我从选择表中首先选择,然后使用options_group做第二次选择并获得每一行的所有选项,或者我做一个连接并获得一个有很多行的表?

在你提出它之前,我没有发现任何其他答案都回答了这个确切的问题。

还有其他更好的方法吗?我读到连接比多重选择快几个数量级,但最后解析它可能需要更多时间。

+1

描述不佳的问题。我无法超越中途点阅读。必须抵制downvote ... – necromancer

+0

换句话说,它会杀了你复制/粘贴'describe'表的输出吗? – necromancer

+0

我想这是更假设的(呃......因为我还没有创建数据库)。基本上,在多对一的关系中,从“一个”表中选择多行时使用多个选择,还是使用连接并具有“一个”表中的重复行? – dudewad

回答

1

使用select distinct的单个语句清除重复项。作为SQL基础的关系演算/关系代数将自动消除作为project运算符一部分的重复项。但是,默认情况下,SQL不这样做,并且需要您使用distinct。因为潜在的关系理论鼓励一个单一的陈述,并且它适合于运营商,所以我推荐它作为最佳实践。

两个表parent (id)child (id, parent_id, property)select distinct parent.id from parent join child on parent.id = child.id where child.property in ("X", "Z");

+0

这很有帮助。谢谢 – dudewad

+0

不客气。很高兴它是有帮助的! :) – necromancer

1

既然你问的很好的做法,我会扔在事实上,这并不一定是唯一的DB-解决方案。在应用层或类似memcached等内容中缓存静态/查找数据(听起来像模型和/或部件不经常更改)是一个很好的做法,它会为您节省连接并减少结果集大小。

+0

谢谢,其真正帮助的微妙之处。我会牢记这一点。 – dudewad