Database design 分面搜索的数据库结构

Database design 分面搜索的数据库结构,database-design,data-structures,entity-attribute-value,faceted-search,categorization,Database Design,Data Structures,Entity Attribute Value,Faceted Search,Categorization,我正在创建一个电子商务网站,该网站需要一个分面搜索工具,以便客户可以通过与和相同风格的类别和分类缩小产品搜索范围(请参见左侧菜单) 我最初直接设计了一个类似于EAV结构的数据库(当时我不知道这是什么),这最初看起来很理想,因为我可以创建无限的类别、子类别和其他产品分类(即颜色、大小、收件人),客户可以使用这些分类来查找特定的产品。然而,当我开始尝试使用和条件创建SQL查询时,我意识到普通的简单查询编写起来是多么漫长和复杂 在花了几个小时阅读了SO上的各种帖子和Google上的文章后,我逐渐意识到

我正在创建一个电子商务网站,该网站需要一个分面搜索工具,以便客户可以通过与和相同风格的类别和分类缩小产品搜索范围(请参见左侧菜单)

我最初直接设计了一个类似于EAV结构的数据库(当时我不知道这是什么),这最初看起来很理想,因为我可以创建无限的类别、子类别和其他产品分类(即颜色、大小、收件人),客户可以使用这些分类来查找特定的产品。然而,当我开始尝试使用
条件创建SQL查询时,我意识到普通的简单查询编写起来是多么漫长和复杂

在花了几个小时阅读了SO上的各种帖子和Google上的文章后,我逐渐意识到如果我继续使用这种方法,将会有一场噩梦

问题

网站是如何喜欢和设计他们的分面搜索的

我是否错过了另一种方法,或者他们只是继续使用EAV结构?
我希望避免使用像Lucene/Solr这样的企业解决方案。

那么,为什么称Lucene/Solr为明智的企业解决方案。。。在我看来,似乎完全符合您的需要。

那么,您为什么称Lucene/Solr为明智的企业解决方案。。。在我看来,似乎完全符合您的需要。

我不知道他们是如何做到的,但您可以通过以下方式实现:

CREATE TABLE  product_facets (
  product_id INTEGER NOT NULL,
  facet VARCHAR(100) NOT NULL,
  facet_value varchar(255) NOT NULL,
  PRIMARY KEY (product_id,facet,facet_value),
  KEY (facet,facet_value)
);

INSERT INTO product_facets VALUES (1, 'COLOR', 'Red');
INSERT INTO product_facets VALUES (1, 'PRICE_RANGE', 'Less than 200');

INSERT INTO product_facets VALUES (2, 'COLOR', 'Green');
INSERT INTO product_facets VALUES (2, 'PRICE_RANGE', 'From $200 to $500');

INSERT INTO product_facets VALUES (2, 'COLOR', 'Blue');
INSERT INTO product_facets VALUES (3, 'PRICE_RANGE', 'More than $1000');

SELECT facet, facet_value, count(*)
FROM   product_facets f
INNER  JOIN products p ON p.product_id = f.product_id
GROUP BY facet, facet_value;

facet不必是VARCHAR。它可以是一个简单的整数,因为您的应用程序知道它的含义。

我不知道它们是如何实现的,但您可以通过执行以下操作来实现:

CREATE TABLE  product_facets (
  product_id INTEGER NOT NULL,
  facet VARCHAR(100) NOT NULL,
  facet_value varchar(255) NOT NULL,
  PRIMARY KEY (product_id,facet,facet_value),
  KEY (facet,facet_value)
);

INSERT INTO product_facets VALUES (1, 'COLOR', 'Red');
INSERT INTO product_facets VALUES (1, 'PRICE_RANGE', 'Less than 200');

INSERT INTO product_facets VALUES (2, 'COLOR', 'Green');
INSERT INTO product_facets VALUES (2, 'PRICE_RANGE', 'From $200 to $500');

INSERT INTO product_facets VALUES (2, 'COLOR', 'Blue');
INSERT INTO product_facets VALUES (3, 'PRICE_RANGE', 'More than $1000');

SELECT facet, facet_value, count(*)
FROM   product_facets f
INNER  JOIN products p ON p.product_id = f.product_id
GROUP BY facet, facet_value;

facet不必是VARCHAR。它可以是一个简单的整数,因为您的应用程序知道它的含义。

我认为您混合了不同的概念(这反过来可能会使找到解决方案更加困难)

分面搜索基本上是指按“项目”的特定质量进行过滤。这种质量或属性可能是它所属的一个类别,也可能是其他类别

例如,您可以对用户进行分面搜索,根据他们的年龄进行筛选

[    User   ]
| name char |
| age  int  |
如何调整Solr(或Sphinx)以获得最终结果可能会有所不同,但它对数据模型没有影响

我将首先对您试图在数据库中表示/存储的内容进行概念化/建模。如何显示它或搜索它将在以后出现


如果没有更多细节,你关于其他网站
如何设计分面搜索的问题太广泛,同时也非常简单:你只需要根据产品的不同属性生成不同的分面;但您似乎也想知道他们是如何对数据库进行建模以存储信息的。

我认为您混合了不同的概念(这反过来可能会使找到解决方案更加困难)

分面搜索基本上是指按“项目”的特定质量进行过滤。这种质量或属性可能是它所属的一个类别,也可能是其他类别

例如,您可以对用户进行分面搜索,根据他们的年龄进行筛选

[    User   ]
| name char |
| age  int  |
如何调整Solr(或Sphinx)以获得最终结果可能会有所不同,但它对数据模型没有影响

我将首先对您试图在数据库中表示/存储的内容进行概念化/建模。如何显示它或搜索它将在以后出现

如果没有更多细节,你关于其他网站
如何设计分面搜索的问题太广泛,同时也非常简单:你只需要根据产品的不同属性生成不同的分面;但您似乎也想知道他们是如何对数据库进行建模以存储信息的。

Ebuyer使用solr,有充分的理由,你有可能重新发明轮子。

Ebuyer使用solr,有充分的理由,你可能会重新发明轮子