Как Вы моделируете пользовательские атрибуты объектов?

Ну, наконец, я исправил это

Все, что вам нужно сделать, это загрузить другой драйвер хранилища , в моем случае я буду использовать overlay :

  1. Отключить службу Docker : sudo systemctl stop docker.service
  2. Запустить демон Docker (драйвер overlay): sudo docker daemon -s overlay
  3. Запустить демонстрационный контейнер : sudo docker run hello-world

Чтобы сделать эти изменения постоянными, необходимо отредактировать /etc/default/docker и добавьте параметр:

DOCKER_OPTS="-s overlay"

В следующий раз, когда загрузится служба Docker , она запустится docker daemon -s overlay

5
задан Michal 20 May 2009 в 02:57
поделиться

4 ответа

Группировка будет непростой, потому что какой оператор агрегирования вы собираетесь использовать для "цвета"? Обратите внимание, что невозможно использовать ваше требование 4 в случае 2.

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

Это классическая модель EAV, и ей есть место в базах данных, которые тщательно разработаны. Чтобы сделать его более типичным, я видел случаи, когда значения хранятся в типобезопасных таблицах, а не в одном столбце varchar произвольной формы.

Вместо значений:

EntityID int
,AttributeID int
,Value varchar(255)

У вас есть несколько таблиц:

EntityID int
,AttributeID int
,ValueMoney money

EntityID int
,AttributeID int
,ValueInt int

etc.

Затем, чтобы получить емкость iPod на поколение:

SELECT vG.ValueVarChar AS Generation, SUM(vC.ValueDecimal) AS TotalCapacity
FROM Products AS p
INNER JOIN Attributes AS aG
    ON aG.AttributeName = 'generation'
INNER JOIN ValueVarChar AS vG
    ON vG.EntityID = p.ProductID
    AND vG.AttributeID = aG.AttributeID
INNER JOIN Attributes AS aC
    ON aC.AttributeName = 'capacity'
INNER JOIN ValueDecimal AS vC
    ON vC.EntityID = p.ProductID
    AND vC.AttributeID = aC.AttributeID
GROUP BY vG.ValueVarChar
3
ответ дан 18 December 2019 в 13:18
поделиться

Я бы порекомендовал дизайн Наследование конкретной таблицы или Наследование таблицы классов . Оба дизайна удовлетворяют всем четырем вашим критериям.

В наследовании конкретной таблицы:

  1. Ipods хранятся в таблице product_ipods со столбцами ID , Name , Емкость , Поколение .
  2. Футболки хранятся в таблице product_tshirts со столбцами ID , Имя , Размер , Цвет . 1252] Определение конкретных типов продуктов находится в метаданных (определениях таблиц) product_ipods и product_tshirts .
  3. SELECT SUM (Capacity) FROM product_ipods GROUP BY Generation ;

В наследовании таблицы классов:

  1. Общие атрибуты продукта хранятся в таблице Продукты со столбцами ID , Имя .

    Ipods хранятся в таблица product_ipods со столбцами product_id (внешний ключ для Products.ID ), Емкость , Поколение .

  2. Футболки хранятся в таблице product_tshirts со столбцами product_id (внешний ключ к Products.ID ), Размер , Цвет .
  3. Определение конкретных типов продуктов содержится в метаданных (определениях таблиц) products , product_ipods и product_tshirts .
  4. ВЫБРАТЬ СУММУ (Емкость) ОТ product_ipods GROUP BY Generation ;

См. Также мой ответ на « Таблица продуктов, многие виды продуктов, каждый продукт имеет множество параметров », где я описываю несколько решений для типа проблемы, которую вы описываете. Я также подробно расскажу о том , почему EAV - это неработающий дизайн.


Re comment from @dcolumbus:

Будет ли каждая строка product_ipods вариацией с собственной ценой при использовании CTI?

Я ожидаю, что столбец с ценой появится в таблице продуктов , если у каждого типа продукта есть цена. При использовании CTI в таблицах типов продуктов обычно есть столбцы для атрибутов, относящихся только к этому типу продуктов. Любые атрибуты, общие для всех типов продуктов, получают столбцы в родительской таблице.

Кроме того, при сохранении позиций заказа, вы бы затем сохранили строку из product_ipods как позицию?

В таблице позиций сохраните идентификатор продукта, который должен иметь одинаковое значение как в таблице products , так и в таблице product_ipods .


Re comments from @ dcolumbus:

Мне это кажется лишним ... в этом сценарии я не вижу смысла в подтаблице. Но даже если подтаблица имеет смысл, каков соединительный идентификатор ?

Задача подтаблицы - хранить столбцы, которые не нужны для всех других типов продуктов.

идентификатор подключения может быть автоматически увеличивающимся числом. Таблице подтипа не нужно автоматически увеличивать свой собственный идентификатор, потому что она может просто использовать значение, сгенерированное супертаблицей.

CREATE TABLE products (
  product_id INT AUTO_INCREMENT PRIMARY KEY,
  sku VARCHAR(30) NOT NULL,
  name VARCHAR(100) NOT NULL,
  price NUMERIC(9,2) NOT NULL
);

CREATE TABLE product_ipods (
  product_id INT PRIMARY KEY,
  size TINYINT DEFAULT 16,
  color VARCHAR(10) DEFAULT 'silver',
  FOREIGN KEY (product_id) REFERENCES products(product_id)
);

INSERT INTO products (sku, name, price) VALUES ('IPODS1C1', 'iPod Touch', 229.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 16, 'silver');
INSERT INTO products (sku, name, price) VALUES ('IPODS1C2', 'iPod Touch', 229.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 16, 'black');
INSERT INTO products (sku, name, price) VALUES ('IPODS1C3', 'iPod Touch', 229.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 16, 'red');
INSERT INTO products (sku, name, price) VALUES ('IPODS2C1', 'iPod Touch', 299.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 32, 'silver');
INSERT INTO products (sku, name, price) VALUES ('IPODS2C2', 'iPod Touch', 299.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 32, 'silver');
INSERT INTO products (sku, name, price) VALUES ('IPODS2C3', 'iPod Touch', 299.00);
INSERT INTO product_ipods VALUES (LAST_INSERT_ID(), 32, 'red');
11
ответ дан 18 December 2019 в 13:18
поделиться

CREATE TABLE для новых продуктов и ALTER TABLE, добавляя / удаляя столбцы, когда пользователь выполняет операции. Используйте схему, чтобы узнать, какими свойствами обладает каждый продукт. Это удовлетворяет всем четырем вашим требованиям.

Вам также понадобится таблица для хранения имен других таблиц или префикс таблиц с чем-то, что вы можете запросить для sysobjects для таблиц:

select [name] from sysobjects where [name] like 'product_%' AND xtype='U'
0
ответ дан 18 December 2019 в 13:18
поделиться

Похоже, вы хотите создать базу данных каталога продуктов.

Я рекомендую этот подход. http://edocs.bea.com/wlp/docs40/catalog/schemcat.htm

0
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: