Как работать с многомерными матрицами в SQL? - PullRequest
0 голосов
/ 22 января 2019

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

Продукт A

         Value x
Age                 0 - 18    19 - 64    65 - 150
         50          5.6        6.3        3.5
         100         5.2        3.5        6.3
         200         6.4        3.7       12.3
         500         3.9        2.3        5.5

Есть несколько таких продуктов. Значения x и диапазоны возраста могут варьироваться.

Таким образом, цена продукта зависит от типа продукта, возраста и стоимости x. Как я хочу разработать свои таблицы для обеспечения нормализации?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы можете захотеть 4 таблицы.

1 таблица, хранящая минимальный и максимальный возраст (фактически, каждый диапазон)

1 таблица, хранящая значение x

1 таблица с названием продукта (и другой информацией)

1 таблица отношений между таблицами age, value x и названием продукта, где хранятся их внешние ключи плюс цена. первичный ключ этой таблицы - состав всех ФК для обеспечения уникальных данных.

На самом деле я пишу код SQL, чтобы предоставить вам примеры.

Схема (MySQL v5.7)

CREATE TABLE age
(
  id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  min_age INT(6) NOT NULL,
  max_age INT(6) NOT NULL
);

CREATE TABLE valuex
(
  id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  val INT(6) NOT NULL
);

CREATE TABLE products
(
  id INT(6) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL
);

CREATE TABLE pricing
(
  age_id INT(6) NOT NULL,
  valuex_id INT(6) NOT NULL,
  products_id INT(6) NOT NULL,
  price DECIMAL(5, 2) NOT NULL,
  FOREIGN KEY (age_id) REFERENCES age(id),
  FOREIGN KEY (valuex_id) REFERENCES valuex(id),
  FOREIGN KEY (products_id) REFERENCES products(id),
  PRIMARY KEY (age_id, valuex_id, products_id)
);

INSERT INTO age VALUES (default, 0, 18), (default, 19, 64 ), (default, 65, 150);
INSERT INTO valuex VALUES (default, 5), (default, 100), (default, 200), (default, 500);
INSERT INTO products VALUES (default, "A");

INSERT INTO pricing VALUES (1, 1, 1, 5.6),
                           (2, 2, 1, 6.3),
                           (3, 3, 1, 3.5),
                           (1, 4, 1, 5.2),
                           (2, 1, 1, 3.5),
                           (3, 2, 1, 6.3),
                           (1, 3, 1, 6.4),
                           (2, 4, 1, 3.7),
                           (3, 1, 1, 12.3),
                           (1, 2, 1, 3.9),
                           (2, 3, 1, 2.3),
                           (3, 4, 1, 5.5);

Запрос № 1

-- Get all prices for product A
SELECT CONCAT(a.min_age, ' - ',a.max_age) AS "Age range",
       v.val AS "Value x",
       pr.name AS "Product Name",
       p.price AS "Price"
FROM pricing p
LEFT JOIN age a
ON a.id = p.age_id
LEFT JOIN valuex v
ON v.id = p.valuex_id
LEFT JOIN products pr
ON pr.id = p.products_id
WHERE pr.name = "A";

выход

| Age range | Value x | Product Name | Price |
| --------- | ------- | ------------ | ----- |
| 0 - 18    | 5       | A            | 5.6   |
| 0 - 18    | 100     | A            | 3.9   |
| 0 - 18    | 200     | A            | 6.4   |
| 0 - 18    | 500     | A            | 5.2   |
| 19 - 64   | 5       | A            | 3.5   |
| 19 - 64   | 100     | A            | 6.3   |
| 19 - 64   | 200     | A            | 2.3   |
| 19 - 64   | 500     | A            | 3.7   |
| 65 - 150  | 5       | A            | 12.3  |
| 65 - 150  | 100     | A            | 6.3   |
| 65 - 150  | 200     | A            | 3.5   |
| 65 - 150  | 500     | A            | 5.5   |

Список содержимого всех таблиц

Запрос № 2

SELECT * FROM age;

| id  | min_age | max_age |
| --- | ------- | ------- |
| 1   | 0       | 18      |
| 2   | 19      | 64      |
| 3   | 65      | 150     |

Запрос № 3

SELECT * FROM valuex;

| id  | val |
| --- | --- |
| 1   | 5   |
| 2   | 100 |
| 3   | 200 |
| 4   | 500 |

Запрос № 4

SELECT * FROM products;

| id  | name |
| --- | ---- |
| 1   | A    |

Запрос № 5

SELECT * FROM pricing;

| age_id | valuex_id | products_id | price |
| ------ | --------- | ----------- | ----- |
| 1      | 1         | 1           | 5.6   |
| 1      | 2         | 1           | 3.9   |
| 1      | 3         | 1           | 6.4   |
| 1      | 4         | 1           | 5.2   |
| 2      | 1         | 1           | 3.5   |
| 2      | 2         | 1           | 6.3   |
| 2      | 3         | 1           | 2.3   |
| 2      | 4         | 1           | 3.7   |
| 3      | 1         | 1           | 12.3  |
| 3      | 2         | 1           | 6.3   |
| 3      | 3         | 1           | 3.5   |
| 3      | 4         | 1           | 5.5   |

Просмотр на БД Fiddle

0 голосов
/ 22 января 2019

По сути, у вас будет 4 таблицы.

Один будет содержать информацию о продукте,
Один будет содержать возрастные диапазоны (примечание: предполагается, что возрастные диапазоны одинаковы для каждого продукта)
Одно будет содержать значения X,
и последняя будет содержать цену с использованием внешних ключей для 3 таблиц, которые я перечислил ранее.

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

Как-то так должно начаться:

create table products 
(
    id int primary key,
    name varchar(100)
    -- other product related details such as description ans stuff
);

create table ageRanges
(
    product_id int foreign key references products(id),
    id int primary key,
    name varchar(100)
)

create table X
(
    product_id int foreign key references products(id),
    value int
)

create table prices
(
    product_id int foreign key references products(id),
    ageRange_id int foreign key references ageRanges(id), 
    x_id int foreign key references X(id), 
    price numeric(10, 2)
)
0 голосов
/ 22 января 2019

Эти отношения могут подходить:

Product(name,*ID*) 
Relation (*product_ID,type_id,age_id,value_X_id*) FK product_id references product, type references types, age references ages, valueX references value_2s
ValueXs(*ID*, value)
Type2(*ID*, value)
Age(*ID*, value)

Это полностью нормализованная форма, Примечание: страррированные куты подчеркивают, что такое ID

...