Дизайн стола для соответствующей системы - PullRequest
2 голосов
/ 21 июля 2010

Как бы я разработал таблицы для соответствующей системы, выполнив что-то вроде этого:

У нас есть X продуктов, которые могут иметь свойства Y. Количество свойств может варьироваться от продукта к продукту, и два продукта не должны иметь схожие свойства.

Моя цель номер один - взять один товар и найти наиболее похожий товар.

Обычно я бы сделал что-то вроде этого:

create table products
(
   id serial not null primary key,
   name varchar(40)
)

create table properties
(
  id serial not null primary key,
  name varchar(40)
)

create table product_properties
(
  product_id int not null,
  property_id int not null
)

Единственный способ, которым я могу придумать, - это просмотреть все продукты, получить их свойства в цикле и сравнить с исходным продуктом. Но это не кажется очень эффективным.

1 Ответ

2 голосов
/ 21 июля 2010

Может ли что-нибудь подобное помочь?

SELECT *
    FROM products
    WHERE id <> <given product id>
    ORDER BY (SELECT COUNT(*)
                  FROM product_properties
                  WHERE product_properties.product_id = products.id AND
                        product_properties.property_id IN
                                (SELECT property_id
                                     FROM product_property
                                     WHERE product_id = <given product id>))
    LIMIT 1;

Это предназначено для получения продукта, который имеет большинство свойств, общих с вашим исходным продуктом.

...