1

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

在这种情况下,基本上我有 5 张桌子-

  1. 模型
  2. 选择
  3. 选项组
  4. 选项

选择表是一个多列查找表,其中包含:

  • 品牌标识
  • model_id
  • options_group_id

options_group 表是一个查找表,具有“选项组”的 ID 和每个 option_id 的条目。

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

正确的。所以。我想选择生成表格的特定部分:

  • 模型
  • 选项

其中“选项”是根据 options_group 生成的。

我的问题是:我是否使用多个选择语句来执行此操作,我首先从选择表中选择,然后使用 options_group 进行第二次选择并获取每一行的所有选项,或者我是否进行连接和得到一个有很多行的表?

在您提出建议之前,我没有发现 SO 上的任何其他答案都在回答这个确切的问题。

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

4

2 回答 2

1

use a single statement with select distinct to weed out duplicates. the relational-calculus / relational-algebra that underlies SQL automatically eliminates duplicates as part of the project operator. however, SQL by default does not do so and requires you to use distinct. because underlying relational theory encourages a single statement, and it fits neatly into the operators, i recommend it as a best practice.

with two tables parent (id) and child (id, parent_id, property) do select distinct parent.id from parent join child on parent.id = child.id where child.property in ("X", "Z");

于 2013-05-21T00:34:53.953 回答
1

既然您要求良好的做法,我会提出这样一个事实,即这不一定是一个仅限 db 的解决方案。在应用程序层或 memcached 之类的东西中缓存静态/查找数据(听起来像模型和/或部件不会经常更改)是一种很好的做法,它会为您节省连接并减少您的结果集大小。

于 2013-05-21T00:59:39.527 回答