Структура данных, не хочу хранить список в виде текста - PullRequest
0 голосов
/ 26 ноября 2009

Все - Мне нужна помощь в разработке таблицы для базы данных Postgre SQL. У меня есть таблица продуктов т.е.

CREATE TABLE products (  
    product_id integer PRIMARY KEY,  
    product_name text,  
    price numeric);  

INSERT INTO products (product_id, product_name, price) VALUES   
(DEFAULT, 'Purple Widget', '5.50'),  
(DEFAULT, 'Green Widget', '1.50'),  
(DEFAULT, 'Yellow Widget', '5.50'),  
(DEFAULT, 'Spotted Widget', '6.50'),  
(DEFAULT, 'Extra Large Purple Widget', '102.50'),  
(DEFAULT, 'Extra Large Spotted Widget', '101.50');    

Я хочу начать продавать пакет товаров (несколько товаров, одна цена). Я пытаюсь выяснить структуру таблицы пакетов. Мне не нравятся два варианта:

CREATE TABLE packages (  
    package_id integer PRIMARY KEY,   
    package_name text,
    package_products varchar(50),  
    price numeric);  

INSERT INTO packages (package_id, package_name, package_products, price) VALUES  
    (DEFAULT, 'Small Widgets', '0,1,2,3', '6.25'),  
    (DEFAULT, 'Large Widgets', '5,6', '200.00');  

или

CREATE TABLE packages (  
    package_id integer PRIMARY KEY,   
    package_name text,
    product_id1 integer,  
    product_id2 integer,  
    product_id3 integer,  
    product_id4 integer,  
    product_id5 integer,  
    price numeric);  

INSERT INTO packages (package_id, package_name, product_id1, product_id2, 
                      product_id3, product_id4, product_id5, price) VALUES  
    (DEFAULT, 'Small Widgets', '0', '1' ,'2', '3', NULL, '6.25'),  
    (DEFAULT, 'Large Widgets', '5', '6', NULL, NULL, NULL, '200.00');  

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

Идеи? Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 26 ноября 2009

Также обратите внимание, что вы должны наложить ограничения внешнего ключа на столбцы, которые ссылаются на строки в других таблицах.

CREATE TABLE PackageProduct (
product_id integer,
package_id integer,
FOREIGN KEY (product_id) REFERENCES Product(product_id),
FOREIGN KEY (package_id) REFERENCES Package(package_id));
4 голосов
/ 26 ноября 2009

Это стандартное отношение «многие ко многим» (множество пакетов ко многим элементам)

CREATE TABLE products (
product_id integer PRIMARY KEY,
product_name text,
price numeric);

CREATE TABLE packages (
package_id integer PRIMARY KEY,
package_name text,
price numeric); 

CREATE TABLE package_items (
package_item_id integer PRIMARY KEY,
package_id integer,
product_id integer,
qty integer );
1 голос
/ 26 ноября 2009

А как насчет таблицы Package и таблицы PackageProduct?

CREATE TABLE Product (
product_id integer PRIMARY KEY,
product_name text,
price numeric); 

CREATE TABLE Package (
package_id integer PRIMARY KEY,
package_name text
price numeric); 

CREATE TABLE PackageProduct (
product_id integer,
package_id integer); 

Затем просто добавьте свои пакеты в таблицу пакетов и добавьте строку для каждого продукта в пакете в таблицу PackageProduct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...