E-commerce database design I am new to database design but am fairly familiar with SQL and its syntax. I want to create a database for an e-commerce website that will sell a single product type such as a shirt. They could be different sizes, colors, and design. I formulated list of information I thought would be necessary to collect from a visitor and are included in the tables I made.

Right now I have tables being:


Products
Customer
Credit_Card_Details
Order_Details
State_tax
Shopping_Cart
Purchase_history
Shipping type


The tables I created:

 CREATE TABLE `shipping_type` 
  ( 
 `type_of_shipping` VARCHAR(30) NOT NULL DEFAULT '', 
 `price`            DOUBLE(6, 2) NOT NULL, 
 `aprox_delivery`   INT(11) NOT NULL, 
 PRIMARY KEY (`type_of_shipping`) 
 ) 
 engine=innodb 
 DEFAULT charset=latin1; 



 CREATE TABLE `shopping_cart` 
  ( 
 `shopping_cart_id` INT(11) UNSIGNED NOT NULL auto_increment, 
 `inventory_id`     VARCHAR(11) NOT NULL DEFAULT '', 
 `price`            DOUBLE(6, 2) NOT NULL, 
 `date`             DATE NOT NULL, 
 `user_id`          VARCHAR(30) NOT NULL DEFAULT '', 
 `quantity`         INT(11) NOT NULL, 
 PRIMARY KEY (`shopping_cart_id`) 
 ) 
 engine=innodb 
 DEFAULT charset=latin1; 



 CREATE TABLE `state_tax` 
 ( 
 `state_name`     VARCHAR(11) NOT NULL DEFAULT '', 
 `sales_tax_rate` DOUBLE(6, 2) NOT NULL, 
 PRIMARY KEY (`state_name`) 
 ) 
 engine=innodb 
 DEFAULT charset=latin1; 



 CREATE TABLE `purchase_history` 
 ( 
 `user_id`      VARCHAR(30) NOT NULL DEFAULT '', 
 `inventory_id` INT(11) NOT NULL, 
 `date_ordered` DATE NOT NULL, 
 `order_id`     INT(11) NOT NULL, 
 `quantity`     INT(11) NOT NULL, 
 `price`        DOUBLE(6, 2) NOT NULL, 
 PRIMARY KEY (`user_id`) 
 ) 
 engine=innodb 
 DEFAULT charset=latin1; 



CREATE TABLE `products` 
( 
 `inventory_id` INT(11) UNSIGNED NOT NULL auto_increment, 
 `shirt_name`   VARCHAR(50) NOT NULL DEFAULT '', 
 `shirt_size`   VARCHAR(30) NOT NULL DEFAULT '', 
 `shirt_color`  INT(11) NOT NULL, 
 `price`        DOUBLE(6, 2) NOT NULL, 
 PRIMARY KEY (`inventory_id`) 
) 
engine=innodb 
DEFAULT charset=latin1; 



 CREATE TABLE `order_details` 
 ( 
 `order_id`         INT(11) UNSIGNED NOT NULL auto_increment, 
 `user_id`          VARCHAR(30) NOT NULL DEFAULT '', 
 `reciever_name`    VARCHAR(100) NOT NULL DEFAULT '', 
 `address`          VARCHAR(30) NOT NULL DEFAULT '', 
 `city`             VARCHAR(30) NOT NULL DEFAULT '',
 `zip`             VARCHAR(11) NOT NULL DEFAULT '',  
 `state`            VARCHAR(30) NOT NULL DEFAULT '', 
 `type_of_shipping` VARCHAR(30) NOT NULL DEFAULT '', 
 `date_ordered`     DATE NOT NULL, 
 PRIMARY KEY (`order_id`) 
 ) 
 engine=innodb 
 DEFAULT charset=latin1; 


CREATE TABLE `customer` 
 ( 
 `user_id`      VARCHAR(30) NOT NULL DEFAULT '', 
 `password`     VARCHAR(30) NOT NULL DEFAULT '', 
 `fname`        VARCHAR(30) NOT NULL DEFAULT '', 
 `lname`        VARCHAR(30) NOT NULL DEFAULT '', 
 `email`        VARCHAR(30) NOT NULL DEFAULT '', 
 `address`      VARCHAR(30) NOT NULL DEFAULT '', 
 `city`         VARCHAR(30) NOT NULL DEFAULT '', 
 `zip`          INT(11) NOT NULL, 
 `state`        VARCHAR(30) NOT NULL DEFAULT '', 
 `phone number` VARCHAR(11) DEFAULT NULL, 
 PRIMARY KEY (`user_id`) 
) 
engine=innodb 
DEFAULT charset=latin1; 

CREATE TABLE `credit_card_details` 
( 
 `cc_num`    VARCHAR(30) NOT NULL DEFAULT '', 
 `card_type` VARCHAR(30) NOT NULL DEFAULT '', 
 `sec_code`  INT(3) NOT NULL, 
 `exp_date`  DATE NOT NULL, 
 `user_id`   VARCHAR(30) NOT NULL DEFAULT '', 
 PRIMARY KEY (`cc_num`) 
) 
engine=innodb 
DEFAULT charset=latin1; 


Is this the most efficient way to do this? I am pretty sure all tables would be in third normal form, and all can be linked. If this is not the correct way to do this, could somebody please point out to me what I could be doing differently to improve my design or how to implement this design in a better way?
Never assume that you're only going to have one product. That will end up being a limiting factor of your design and can cause you a lot of pain later down the line and rules out any kind of code re-usability. Make your products table generic enough to handle any kind of product. Create color/size attribute tables that you can tie to the product if you need to. 
What about handling the case where people want to order as a guest or will you rule that out entirely?
How will you handle returned items/payment credits, cancelled orders, or an order where the credit card is declined? Are you going to keep history for those?
You will probably need more than 1 line for address. Are you going to handle international orders? If so you'll need to allow for non-numerical zip codes and ones that don't tie to a state.
If you tie shopping carts to cookies then you can reload someone's shopping cart when they come back based on their cookie's ID.
If you're going to keep credit card numbers in the database then you need to be PCI Compliant (https://www.pcisecuritystandards.org/).