Ну, наконец, я исправил это
Все, что вам нужно сделать, это загрузить другой драйвер хранилища , в моем случае я буду использовать overlay
:
sudo systemctl stop docker.service
overlay
): sudo docker daemon -s overlay
sudo docker run hello-world
Чтобы сделать эти изменения постоянными, необходимо отредактировать /etc/default/docker
и добавьте параметр:
DOCKER_OPTS="-s overlay"
В следующий раз, когда загрузится служба Docker , она запустится docker daemon -s overlay
Группировка будет непростой, потому что какой оператор агрегирования вы собираетесь использовать для "цвета"? Обратите внимание, что невозможно использовать ваше требование 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
Я бы порекомендовал дизайн Наследование конкретной таблицы или Наследование таблицы классов . Оба дизайна удовлетворяют всем четырем вашим критериям.
В наследовании конкретной таблицы:
product_ipods
со столбцами ID
, Name
, Емкость
, Поколение
. product_tshirts
со столбцами ID
, Имя
, Размер
, Цвет
. 1252] Определение конкретных типов продуктов находится в метаданных (определениях таблиц) product_ipods
и product_tshirts
. SELECT SUM (Capacity) FROM product_ipods GROUP BY Generation
; В наследовании таблицы классов:
Общие атрибуты продукта хранятся в таблице Продукты
со столбцами ID
, Имя
.
Ipods хранятся в таблица product_ipods
со столбцами product_id
(внешний ключ для Products.ID
), Емкость
, Поколение
.
product_tshirts
со столбцами product_id
(внешний ключ к Products.ID
), Размер
, Цвет
. products
, product_ipods
и product_tshirts
. ВЫБРАТЬ СУММУ (Емкость) ОТ 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');
CREATE TABLE для новых продуктов и ALTER TABLE, добавляя / удаляя столбцы, когда пользователь выполняет операции. Используйте схему, чтобы узнать, какими свойствами обладает каждый продукт. Это удовлетворяет всем четырем вашим требованиям.
Вам также понадобится таблица для хранения имен других таблиц или префикс таблиц с чем-то, что вы можете запросить для sysobjects для таблиц:
select [name] from sysobjects where [name] like 'product_%' AND xtype='U'
Похоже, вы хотите создать базу данных каталога продуктов.
Я рекомендую этот подход. http://edocs.bea.com/wlp/docs40/catalog/schemcat.htm