Building an E-Commerce Site Part 1: Building a Product Catalog - Step 2: Creating the Product Catalog
(Page 5 of 8 )
We have the user account created, now let's create the product catalog tables. Let's say that our product catalog looks like this (yes we have a very small catalog :)
[Top]
|
+--[Fruits]
| |
| +--[Apples]
| | |
| | +-- Granny Smith
| | +-- Red Delicious
| | +-- Rome Beauty
| | +-- Apple Chips
| |
| +--[Citrus]
| | |
| | +-- Orange
| | +-- Lemons
| | +-- Grapefruit
| |
| +--[Berries]
| | |
| | +-- Blueberries
| | +-- Strawberries
| | +-- Raspberries
| |
| +-- Bananas
|
+--[Vegetables]
| |
| +-- [Lettuce]
| | |
| | +-- Butterhead
| | +-- Cutting
| | +-- Crisp
| |
| +-- [Mushrooms]
| | |
| | +-- Truffles
| | +-- Shiitake
| | +-- Enoki
| |
| +-- [Potatoes]
| | |
| | +-- Sweet Potatoes
| | +-- White Rose
| | +-- Russet
| | +-- Potatoe Chips
| |
| +-- Cucumbers
|
+--[Snacks]
|
+-- [Chips]
| |
| +-- Potato Chips
| +-- Apple Chips
| +-- Corn Chips
|
+-- [Icecream]
| |
| +-- Vanilla
| +-- Chocolate
|
+-- Popcorn
What we want is an easy way to manage this catalog in our
database. Product categories are arranged in a tree. There is one root category called Top, under which all other categories will sit. Next, go the subcategories under those, etc. For our products, we want to be able to put a product into one or many categories to make it easy for the customer to find.
So in summary, we have what looks like this:

Reading this clockwise, we say that:
- A category contains zero or more (0|M) products
eg. We have 3 products in the [Apples] category
- A product belongs to one or more (1|M) categories
eg. Potato chips are in the [Potatoes] and [Chips] category
- A category contains one or more (1|M) categories
eg. We have 3 categories under the [Fruits] category
- A category belongs to one and only one (1|1) category
eg. The [Chips] category can only belong under snacks
NOTE: The 0|M, 1|M are just my own notations to represent the optionality and cardinality, if that doesn't make sense to you don't worry about it too much, you can look these terms up in a database book later.
NOTE: We can make categories a many-to-many relation upon itself, such that a category can have multiple sub-categories and belong to multiple parent-categories, but it's a too much to explain for this howto :) so we won't do it like that.
In terms of the database entity relations, we have 2:
- the categories entity is a one-to-many relation upon itself
- the products entity is a many-to-many relation with the categories entity
Now based on the relations that we have defined, we will need three tables to drive our product catalog:
- categories
This table will hold the names of our categories, as well as telling us where this category sits in our catalog.
| Fieldname | Type | Description |
PK | id | int auto_increment | An internal identifier (ID) for this category |
IDX | parent_id | int | The ID of the parent category |
IDX | name | varchar(25) | A name for this category |
| description | varchar(255) | A description for this category |
Since the ID will only be used internally, we will be using a MySQL autonumber to generate them. Also, since the ID field will be used to identify records it will be the primary key of this table. We want to index the parent_id and name fields because we may want to perform searches or look up categories by them.
- products
This table will hold the information about our products, for example the name, description and price, etc. In real life you will have a lot more fields to hold other information about the product, but for the purposes of this guide, this is all you need.
| Fieldname | Type | Description |
PK | id | int auto_increment | An internal identifier (ID) for this product |
IDX | name | varchar(25) | A name for this product |
| description | varchar(255) | A description for this product |
| price | float(5,2) | The price of this product |
- products_categories
Since we have a many-to-many relation between products and categories, we need a table to keep track of these relations. This table simply keeps pairs of product IDs and category IDs that relate to each other.
| Fieldname | Type | Description |
PK | product_id | int | The ID for the product |
PK | category_id | int | The ID for the category |
Okay, so we know what tables we want, now let's write the SQL CREATE TABLE queries to create them in MySQL. Run the following commands (lines in /* */ are comments and will be ignored by MySQL):
mysql> /* create the categories table */
-> CREATE TABLE categories (
-> id int auto_increment not null,
-> parent_id int not null,
-> name varchar(25) not null,
-> description varchar(255) not null,
-> PRIMARY KEY (id),
-> INDEX parent_id (parent_id),
-> INDEX name (name)
-> );
mysql> /* create the products table */
-> CREATE TABLE products (
-> id int auto_increment not null,
-> name varchar(25) not null,
-> description varchar(255) not null,
-> price float(5,2) not null,
-> PRIMARY KEY (id),
-> INDEX name (name)
-> );
mysql>/* create the products_categories table */
->CREATE TABLE
->products_categories (
->product_id int not null,
->category_id int not null,
->PRIMARY KEY (product_id, category_id)
->);
Let's take a look at what we've just created, let's list the
tables with the following command:
mysql> SHOW TABLES;
+---------------------+
| Tables in mymarket |
+---------------------+
| categories |
| products_categories |
| products |
+---------------------+
Now let's look each table with the DESCRIBE command:
mysql> DESCRIBE categories;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | | PRI | 0 | auto_increment |
| parent_id | int(11) | | MUL | 0 | |
| name | varchar(25) | | MUL | | |
| description | varchar(255) | | | | |
+-------------+--------------+------+-----+---------+----------------+
mysql>DESCRIBE products;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | | PRI | 0 | auto_increment |
| name | varchar(25) | | MUL | | |
| description | varchar(255) | | | | |
| price | float(5,2) | | | 0.00 | |
+-------------+--------------+------+-----+---------+----------------+
mysql>DESCRIBE products_categories;
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| product_id | int(11) | | PRI | 0 | |
| category_id | int(11) | | PRI | 0 | |
+-------------+---------+------+-----+---------+-------+
Now that we have all our tables, let's move on and add some
data.
Next: Step 3: Populating the Tables with Data >>
More PHP Articles
More By Ying Zhang