blob: 5d1d6653aba3440c9caf083dd9f4fb57d2e6e013 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="author" content="troy.giunipero@sun.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="In this tutorial unit, you use MySQL Workbench to create an entity-relationship diagram that represents the data model for the application. You then generate a schema from the ER diagram, run it on the MySQL server, and connect to it from the IDE.">
<meta name="keywords" content="NetBeans, IDE, integrated development environment,
Java, Java EE, open source, web technology, e-commerce">
<link rel="stylesheet" type="text/css" href="../../../../netbeans.css">
<link rel="stylesheet" type="text/css" href="../../../../print.css" media="print">
<link rel="stylesheet" type="text/css" href="../../../../lytebox.css" media="screen">
<script type="text/javascript" src="../../../../images_www/js/lytebox-compressed.js"></script>
<title>The NetBeans E-commerce Tutorial - Designing the Data Model</title>
</head>
<body>
<!-- Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -->
<h1>The NetBeans E-commerce Tutorial - Designing the Data Model</h1>
<div style="margin-left:-3px">
<div class="feedback-box margin-around float-left" style="margin-right:15px">
<h4>Tutorial Contents</h4>
<ol>
<li><a href="intro.html">Introduction</a></li>
<li><a href="design.html">Designing the Application</a></li>
<li><a href="setup-dev-environ.html">Setting up the Development Environment</a></li>
<li><strong>Designing the Data Model</strong>
<ul style="margin: 5px 0 0 -2em">
<li><a href="#idEntities">Identifying Entities for the Data Model</a></li>
<li><a href="#createERDiagram">Creating an Entity-Relationship Diagram</a></li>
<li><a href="#forwardEngineer">Forward-Engineering to the Database</a></li>
<li><a href="#connectDB">Connecting to the Database from the IDE</a></li>
<li><a href="#seeAlso">See Also</a></li>
</ul></li>
<li><a href="page-views-controller.html">Preparing the Page Views and Controller Servlet</a></li>
<li><a href="connect-db.html">Connecting the Application to the Database</a></li>
<li><a href="entity-session.html">Adding Entity Classes and Session Beans</a></li>
<li><a href="manage-sessions.html">Managing Sessions</a></li>
<li><a href="transaction.html">Integrating Transactional Business Logic</a></li>
<li><a href="language.html">Adding Language Support</a></li>
<li><a href="security.html">Securing the Application</a></li>
<li><a href="test-profile.html">Testing and Profiling</a></li>
<li><a href="conclusion.html">Conclusion</a></li>
</ol>
</div>
</div>
<p><img src="../../../../images_www/articles/68/netbeans-stamp-68-69.png" class="stamp"
alt="Content on this page applies to NetBeans IDE, versions 6.8 and 6.9"
title="Content on this page applies to NetBeans IDE, versions 6.8 and 6.9"></p>
<p>This tutorial unit focuses on data modeling, or the process of creating a conceptual
model of your storage system by identifying and defining the entities that your system
requires, and their relationships to one another. The data model should contain all
the logical and physical design parameters required to generate a script using the Data
Definition Language (DDL), which can then be used to create a database.<sup><a href="#footnote1"
id="fn1" style="text-decoration:none">[1]</a></sup></p>
<p>In this unit, you work primarily with <a href="http://wb.mysql.com/" target="_blank">MySQL
Workbench</a>, a graphical tool that enables you to create data models, reverse-engineer
SQL scripts into visual representations, forward-engineer data models into database
schemata, and synchronize models with a running MySQL database server.</p>
<p>You begin by creating an entity-relationship diagram to represent the data model for
the <code>AffableBean</code> application. When you have completed identifying and
defining all entities and the relationships that bind them, you use Workbench to
forward-engineer and run a DDL script that converts the data model into a database
schema. Finally, you connect to the new schema from the NetBeans IDE.</p>
<p>You can view a live demo of the application that you build in this tutorial:
<a href="http://services.netbeans.org/AffableBean/" target="_blank">NetBeans E-commerce
Tutorial Demo Application</a>.</p>
<br style="clear:both;">
<br>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html" target="_blank">NetBeans
IDE</a></td>
<td class="tbltd1">Java bundle, 6.8 or 6.9</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Java Development Kit (JDK)</a></td>
<td class="tbltd1">version 6</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://dev.mysql.com/downloads/mysql/" target="_blank">MySQL database server</a></td>
<td class="tbltd1">version 5.1</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://dev.mysql.com/downloads/workbench/" target="_blank">MySQL Workbench</a></td>
<td class="tbltd1">version 5.1 or 5.2</td>
</tr>
</tbody>
</table>
<p><strong class="notes">Notes:</strong></p>
<ul>
<li>The NetBeans IDE requires the Java Development Kit (JDK) to run properly.
If you do not have any of the resources listed above, the JDK should be
the first item that you download and install.</li>
<li>The NetBeans IDE Java Bundle includes Java Web and EE technologies, which are
required for the application you build in this tutorial.</li>
<li>You can download the complete DDL script that MySQL Workbench generates from
the entity-relationship diagram you create in this tutorial:
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252Fecommerce%252Faffablebean_schema_creation.sql">affablebean_schema_creation.sql</a>.</li>
</ul>
<br>
<h2 id="idEntities">Identifying Entities for the Data Model</h2>
<p>In the real world, you may not have the luxury of designing the data model for your
application. For example, your task may be to develop an application on top of an
existing database system. Provided you do not have a data model to base your application
on, creating one should be one of the first design steps you take before embarking on
development. Creating a data model involves identifying the objects, or <em>entities</em>,
required by your system and defining the relationships between them.</p>
<p id="nounList">To begin identifying the entities we need for the data model,
re-examine the use-case presented in <a href="design.html#mockups">Designing
the Application</a>. Search for commonly-occurring nouns. For example:</p>
<div class="indent">
<div class="feedback-box margin-around float-left" style="width:723px">
<h3>Use-Case</h3>
<p><strong>Customer</strong> visits the welcome page and selects a product
<strong>category</strong>. <strong>Customer</strong> browses <strong>products</strong>
within the selected category page, then adds a <strong>product</strong> to
his or her <strong>shopping cart</strong>. <strong>Customer</strong> continues
shopping and selects a different <strong>category</strong>. <strong>Customer</strong>
adds several <strong>products</strong> from this <strong>category</strong> to
<strong>shopping cart</strong>. <strong>Customer</strong> selects 'view cart'
option and updates quantities for cart <strong>products</strong> in the cart
page. <strong>Customer</strong> verifies shopping cart contents and proceeds
to checkout. In the checkout page, <strong>customer</strong> views the cost of
the <strong>order</strong> and other information, fills in personal data, then
submits his or her details. The <strong>order</strong> is processed and
<strong>customer</strong> is taken to a confirmation page. The confirmation
page provides a unique reference number for tracking the customer <strong>order</strong>,
as well as a summary of the <strong>order</strong>.</p>
</div>
</div>
<br style="clear:both">
<br>
<p>The text highlighted above in <strong>bold</strong> indicates the candidates that we
can consider for the data model. Upon closer inspection, you may deduce that the
shopping cart does not need to be included, since the data it provides (i.e., products
and their quantities) is equally offered by a customer order once it is processed. In
fact, as will be demonstrated in Unit 8, <a href="manage-sessions.html">Managing Sessions</a>,
the shopping cart merely serves as a mechanism that retains a user session temporarily
while the customer shops online. We can therefore settle on the following list:</p>
<ul class="toc">
<li><strong>customer</strong></li>
<li><strong>category</strong></li>
<li><strong>product</strong></li>
<li><strong>order</strong></li>
</ul>
<p>With these four entities, we can begin constructing an entity-relationship diagram (ERD).</p>
<p class="notes"><strong>Note:</strong> In this tutorial, we create a database schema from
the ERD, then use the IDE's EclipseLink support to generate JPA entity classes from the
existing database. (EclipseLink and the Java Persistence API (JPA) are covered in Unit
7, <a href="entity-session.html">Adding Entity Classes and Session Beans</a>.) This
approach is described as <em>bottom up</em> development. An equally viable alternative
is the <em>top down</em> approach.</p>
<ul>
<li><strong>Top down:</strong> In <em>top down</em> development, you start with
an existing Java implementation of the domain model, and have complete freedom
with respect to the design of the database schema. You must create mapping
metadata (i.e., annotations used in JPA entity classes), and can optionally
use a persistence tool to automatically generate the schema.</li>
<li><strong>Bottom up:</strong> <em>Bottom up</em> development begins with an
existing database schema. In this case, the easiest way to proceed is to use
forward-engineering tools to extract metadata from the schema and generate
annotated Java source code (JPA entity classes).</li>
</ul>
<p>For more information on top down and bottom up design strategies, see
<a href="http://en.wikipedia.org/wiki/Data_modeling#Modeling_methodologies" target="_blank">Data
modeling: Modeling methodologies</a> [Wikipedia].</p>
<br>
<h2 id="createERDiagram">Creating an Entity-Relationship Diagram</h2>
<p>Start by running MySQL Workbench. In this exercise, you use Workbench to design an
entity-relationship diagram for the <code>AffableBean</code> application.</p>
<p class="notes"><strong>Note:</strong> The following instructions work for MySQL Workbench
versions 5.1 <em>and</em> 5.2. The images used in this tutorial are taken from version 5.2.
There are slight differences in the graphical interface between versions, however the
functionality remains consistent. Because version 5.2 incorporates a query editor (previously
MySQL Query Browser), as well as a server administration interface (previously MySQL
Administrator), you are presented with the Home screen when opening the application
(shown below).</p>
<div class="indent">
<a href="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench-home.png"
rel="lytebox" title="In Workbench 5.2, the Home screen serves as a central interface to
the data modeling tool, an SQL editor, and an administration tool">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench-home.png"
class="margin-around b-all" style="width: 728px" alt="MySQL Workbench 5.2 - Home screen"
title="Click to enlarge"></a>
</div>
<p>If you are working in Workbench 5.2, click <strong>Create New EER Model</strong> beneath
the Data Modeling heading in the Home screen.</p>
<ul>
<li><a href="#createSchema">Creating the <code>affablebean</code> Schema</a></li>
<li><a href="#createEntities">Creating Entities</a></li>
<li><a href="#addProperties">Adding Entity Properties</a></li>
<li><a href="#identifyRelationships">Identifying Relationships</a></li>
</ul>
<div class="indent">
<h3 id="createSchema">Creating the <code>affablebean</code> Schema</h3>
<ol>
<li>In the default interface, begin by creating a new schema which will be used with
the <code>AffableBean</code> application. Click the plus (
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/plus-icon.png"
class="b-all" alt="Plus icon"> ) icon located to the right of the <strong>Physical
Schemata</strong> heading.
<br><br>
A new panel opens in the bottom region of the interface, enabling you
to specify settings for the new schema.
<br>
<a href="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench.png"
rel="lytebox" title="Use Workbench to create a new database schema">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench.png"
class="margin-around b-all" style="width: 688px" alt="New schema panel displays in bottom region of interface"
title="Click to enlarge"></a></li>
<li>Enter the following settings for the new schema:
<ul style="margin: 5px 0 0 -.7em">
<li><strong>Schema Name:</strong> <code>affablebean</code></li>
<li><strong>Default Collation:</strong> <code>utf8 - utf8_unicode_ci</code></li>
<li><strong>Comments:</strong> <code>Schema used with the AffableBean application</code></li>
</ul>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/affablebean-schema.png"
class="margin-around b-all" style="width: 688px" alt="Settings for 'affablebean' schema"
title="Enter settings for 'affablebean' schema">
<br>
The new schema is created, and becomes listed under the Catalog tab in the right region
of the Workbench interface.
<br><br>
<p class="tips">For an explanation of character sets and collations, see the MySQL
Server Manual: <a href="http://dev.mysql.com/doc/refman/5.1/en/charset-general.html" target="_blank">9.1.1.
Character Sets and Collations in General</a>.</p></li>
</ol>
<h3 id="createEntities">Creating Entities</h3>
<p>Start by creating a new entity-relationship diagram in MySQL Workbench. You can
drag-and-drop entity tables onto the canvas.</p>
<ol>
<li>Under the EER Diagrams heading in WorkBench, double-click the Add
Diagram ( <img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/add-diagram-btn.png"
alt="Add Diagram icon"> ) icon. A new EER Diagram opens displaying an empty canvas.
<br><br>
<span class="tips">'EER' stands for Enhanced Entity-Relationship.</span>
<br>
<a href="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench-empty-canvas.png"
rel="lytebox" title="Use Workbench to create a new database schema">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/workbench-empty-canvas.png"
class="margin-around b-all" style="width: 688px" alt="New EER Diagram displayed an empty canvas"
title="Click Add Diagram to create a new, empty canvas"></a></li>
<li>Click the New Table ( <img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-new-table-icon.png"
alt="New Table icon"> ) icon located in the left margin, then hover your mouse onto the canvas
and click again. A new table displays on the canvas.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-new-entity-table.png"
class="margin-around b-all" alt="New entity table displayed on canvas"
title="Click the New Table icon to drag empty tables (entities) onto the canvas"></li>
<li>Double-click the table. The Table editor opens in the bottom region of the interface, allowing
you to configure settings for the table.
<br><br>
<p class="notes"><strong>Note:</strong> The terms 'table' and 'entity' are nearly synonymous in this tutorial
unit. From the point of view of a database schema, you are creating tables. From a data modeling
perspective, you are creating entities. Likewise, the columns that you later create for each
table correspond to entity <em>properties</em>.</p></li>
<li>In the Table editor, rename the table to one of the nouns you identified from the use-case above.
Optionally add a comment describing the purpose of the table. For example:
<ul style="margin: 5px 0 0 -.7em">
<li><strong>Name:</strong> <code>customer</code></li>
<li><strong>Engine:</strong> <code>InnoDB</code></li>
<li><strong>Comments:</strong> <code>maintains customer details</code></li>
</ul>
<a href="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-customer-table.png" rel="lytebox"
title="Changes made in the Table editor are immediately updated elsewhere in the Workbench interface">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-customer-table.png"
class="margin-around b-all" alt="Customer table displayed on canvas" style="width:688px"
title="Click to enlarge"></a>
<p class="tips">The <a href="http://www.innodb.com/" target="_blank">InnoDB</a> engine
provides foreign key support, which is utilized in this tutorial. Later, under
<a href="#forwardEngineer">Forward-Engineering to the Database</a>, you set the
default storage engine used in Workbench to InnoDB.</p></li>
<li>Under the <strong>Catalog</strong> tab in the left region of WorkBench (right region for
version 5.1), expand the <code>affablebean</code> &gt; <code>Tables</code> node. The
<strong>customer</strong> table now displays.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-catalog-tab.png"
class="margin-around b-all" alt="Catalog tab displaying new customer table"
title="Catalog tab automatically refreshes to display any changes to the schema">
<p>More importantly, note that the new <code>customer</code> table is now included in the
<code>affablebean</code> schema. Because the <code>affablebean</code> schema was selected
when you created the new EER diagram, any changes you make to the diagram are automatically
bound to the schema.</p></li>
<li>Repeat steps 2 - 4 above to add tables to the canvas for the remaining <a href="#nounList">nouns
you identified in the use-case above</a>. Before naming your tables however, there is one important
consideration which you should take into account. Certain keywords hold special meaning for the
SQL dialect used by the MySQL server. Unfortunately, '<code>order</code>' is one of them. (For
example, '<code>order</code>' can be used in an <code>ORDER BY</code> statement.) Therefore,
instead of naming your table '<code>order</code>', name it '<code>customer_order</code>' instead.
At this stage, don't worry about arranging the tables on the canvas in any special order.
<br><br>
<p class="tips">For a list of reserved words used by the MySQL server, refer to the official manual:
<a href="http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-1.html" target="_blank">2.2.
Reserved Words in MySQL 5.1</a>.</p>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/wb-entity-tables.png"
class="margin-around b-all" alt="All tables displayed on canvas"
title="Create all tables for affablebean schema"></li>
</ol>
<h3 id="addProperties">Adding Entity Properties</h3>
<p>Now that you've added entities to the canvas, you need to specify their properties.
Entity properties correspond to the columns defined in a database table. For example,
consider the <code>customer</code> entity. In regard to the <code>AffableBean</code>
application, what aspects of a customer would need to be persisted to the database?
These would likely be all of the information gathered in the <a href="design.html#checkout">checkout
page</a>'s customer details form, as well as some association to the processed order.</p>
<p>When adding properties, you need to determine the most appropriate data type for each
property. MySQL supports a number of data types in several categories: numeric types,
date and time types, and string (character) types. Refer to the official manual for
a summary of data types within each category:
<a href="http://dev.mysql.com/doc/refman/5.1/en/data-type-overview.html" target="_blank">10.1.
Data Type Overview</a>. In this tutorial, the data types have been chosen for you.
Choosing the appropriate data type plays a significant role in optimizing storage
on your database server. For more information see:</p>
<ul style="margin: 0 0 0 -.7em">
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html" target="_blank">10.5. Data Type Storage Requirements</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/choosing-types.html" target="_blank">10.6. Choosing the Right Type for a Column</a></li>
</ul>
<p>The following steps describe how you can use MySQL Workbench to add properties to an
existing entity in your ERD. As with most of the initial design steps, determining
the entity properties would call for careful consideration of the business problem
that needs to be solved, and could require hours of analysis as well as numerous
consultations with the client.</p>
<ol>
<li>Double-click the <code>customer</code> table heading to bring up the Table editor
in WorkBench.</li>
<li>In the Table editor click the Columns tab, then click inside the displayed table
to edit the first column. Enter the following details:
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">PK (Primary Key)</th>
<th class="tblheader" scope="col">NN (Not Null)</th>
<th class="tblheader" scope="col">UN (Unsigned)</th>
<th class="tblheader" scope="col">AI (Autoincrement)</th>
</tr>
<tr>
<td class="tbltd1"><code>id</code></td>
<td class="tbltd1"><code>INT</code></td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
</tr>
</tbody>
</table>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/customer-id-column.png"
class="margin-around b-all" style="width:688px" alt="Customer entity's id column specified"
title="Click to edit table columns in the Table editor"></li>
<li>Continue working in the <code>customer</code> table by adding the following
<code>VARCHAR</code> columns. These columns should be self-explanatory, and
represent data that would need to be captured for the Affable Bean business
to process a customer order and send a shipment of groceries to the customer
address.
<br>
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">NN (Not Null)</th>
</tr>
<tr>
<td class="tbltd1"><code>name</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>email</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>phone</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>address</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>city_region</code></td>
<td class="tbltd1"><code>VARCHAR(2)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>cc_number</code></td>
<td class="tbltd1"><code>VARCHAR(19)</code></td>
<td class="tbltd1">&#10003;</td>
</tr>
</tbody>
</table>
<br>
<span class="tips">For an explanation of the <code>VARCHAR</code>
data type, see the MySQL Reference Manual:
<a href="http://dev.mysql.com/doc/refman/5.1/en/char.html" target="_blank">10.4.1.
The CHAR and VARCHAR Types</a>.</span>
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/customer-varchar-columns.png"
class="margin-around b-all" alt="Customer entity's varchar columns specified"
title="Edit inline to add columns to customer table"></li>
<li>With the <code>customer</code> table selected on the canvas, choose
Arrange &gt; Reset Object Size to resize the table so that all columns
are visible on the canvas. Also click the Indexes row so that any table
indexes are also visible. (This includes primary and foreign keys, which
becomes useful when you begin creating relationships between tables later
in the exercise.)
<br><br>
When you finish, the <code>customer</code> entity looks as follows.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/customer-table.png"
class="margin-around" alt="'customer' table displayed on EER canvas with columns"
title="'customer' table on EER canvas displays columns"></li>
<li>Follow the steps outlined above to create columns for the remaining
tables.
<h4>category</h4>
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">PK</th>
<th class="tblheader" scope="col">NN</th>
<th class="tblheader" scope="col">UN</th>
<th class="tblheader" scope="col">AI</th>
</tr>
<tr>
<td class="tbltd1"><code>id</code></td>
<td class="tbltd1"><code>TINYINT</code></td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
</tr>
<tr>
<td class="tbltd1"><code>name</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
</tbody>
</table>
<h4>customer_order</h4>
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">PK</th>
<th class="tblheader" scope="col">NN</th>
<th class="tblheader" scope="col">UN</th>
<th class="tblheader" scope="col">AI</th>
<th class="tblheader" scope="col">Default</th>
</tr>
<tr>
<td class="tbltd1"><code>id</code></td>
<td class="tbltd1"><code>INT</code></td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>amount</code></td>
<td class="tbltd1"><code>DECIMAL(6,2)</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>date_created</code></td>
<td class="tbltd1"><code>TIMESTAMP</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1"><code>CURRENT_TIMESTAMP</code></td>
</tr>
<tr>
<td class="tbltd1"><code>confirmation_number</code></td>
<td class="tbltd1"><code>INT</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1"><code>&nbsp;</code></td>
</tr>
</tbody>
</table>
<h4>product</h4>
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">PK</th>
<th class="tblheader" scope="col">NN</th>
<th class="tblheader" scope="col">UN</th>
<th class="tblheader" scope="col">AI</th>
<th class="tblheader" scope="col">Default</th>
</tr>
<tr>
<td class="tbltd1"><code>id</code></td>
<td class="tbltd1"><code>INT</code></td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>name</code></td>
<td class="tbltd1"><code>VARCHAR(45)</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>price</code></td>
<td class="tbltd1"><code>DECIMAL(5,2)</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>description</code></td>
<td class="tbltd1"><code>TINYTEXT</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
</tr>
<tr>
<td class="tbltd1"><code>last_update</code></td>
<td class="tbltd1"><code>TIMESTAMP</code></td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1">&nbsp;</td>
<td class="tbltd1"><code>CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP</code></td>
</tr>
</tbody>
</table>
<p class="tips">For details on the <code>TIMESTAMP</code> data type, see the MySQL Reference Manual:
<a href="http://dev.mysql.com/doc/refman/5.1/en/timestamp.html" target="_blank">10.3.1.1. TIMESTAMP Properties</a>.</p>
<br>
When you finish, your canvas will look similar to the following.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/affablebean-tables.png"
class="margin-around b-all" alt="'customer', 'category', 'product', and 'order' tables displayed on EER canvas"
title="Use the Table editor to add columns to all tables on canvas"></li>
</ol>
<h3 id="identifyRelationships">Identifying Relationships</h3>
<p>So far, the entity-relationship diagram contains several entities, but lacks
any relationships between them. The data model that we are creating must
also indicate whether objects are aware of (i.e., contain references to) one
another. If one object contains a reference to another object, this is known
as a <em>unidirectional</em> relationship. Likewise, if both objects refer to
each other, this is called a <em>bidirectional</em> relationship.</p>
<p>References correlate to foreign keys in the database schema. You will note
that, as you begin linking tables together, foreign keys are added as new
columns in the tables being linked.</p>
<p>Two other pieces of information are also commonly relayed in an ERD:
<em>cardinality</em> (i.e., multiplicity) and <em>ordinality</em> (i.e.,
optionality). These are discussed below, as you begin adding relationships
to entities on the canvas. In order to complete the ERD, you essentially
need to create two <em>one-to-many</em> relationships, and one
<em>many-to-many</em> relationship. Details follow.</p>
<ul>
<li><a href="#oneToMany">Creating One-To-Many Relationships</a></li>
<li><a href="#manyToMany">Creating Many-To-Many Relationships</a></li>
</ul>
<h4 id="oneToMany">Creating One-To-Many Relationships</h4>
<p>Examine the four objects currently on the canvas while considering the
business problem. You can deduce the following two <em>one-to-many</em>
relationships:</p>
<ul>
<li>A category must contain one or more products</li>
<li>A customer must have placed one or more orders</li>
</ul>
<p>Incorporate these two relationships into the ERD. You can download a copy
of the MySQL Workbench project that contains the four entities required
for the following steps:
<a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252Fecommerce%252Faffablebean.mwb">affablebean.mwb</a>.</p>
<ol>
<li>In the left margin, click the 1:n Non-Identifying Relationship (
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/one-many-btn.png"
class="b-all" alt="1:n Non-Identifying Relationship button"> ) button.
This enables you to create a <em>one-to-many</em> relationship.</li>
<li>Click the <code>product</code> table, then click the <code>category</code>
table. The first table you click will contain the foreign key reference
to the second table. Here, we want the <code>product</code> table to
contain a reference to <code>category</code>. In the image below, you
see that a new column, <code>category_id</code>, has been added to the
<code>product</code> table, and that a foreign key index,
<code>fk_product_category</code> has been added to the table's indexes.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/product-category-relationship.png"
class="margin-around b-all" alt="'Product-category relationship displayed on EER canvas"
title="A one-to-many relationship is defined between the category and product objects">
<br><br>
Since foreign keys must be of the same data type as the columns they reference,
notice that <code>category_id</code> is of type <code>TINYINT</code>, similar to
the <code>category</code> table's primary key.
<br><br>
<span class="tips">The entity-relationship diagram in this tutorial uses
<a href="http://en.wikipedia.org/wiki/Entity-relationship_model#Crow.27s_Foot_Notation" target="_blank">Crow's
Foot</a> notation. You can alter the relationship notation in WorkBench by
choosing Model &gt; Relationship Notation.</span></li>
<li>Double-click the relationship (i.e., click the dashed line between the two
entities). The Relationship editor opens in the bottom region of the interface.</li>
<li>Change the default caption to '<code>belongs to</code>'. In other words,
&quot;product x belongs to category y.&quot; Note that this is a <em>unidirectional</em>
relationship: A <code>product</code> object contains a reference to the
category it belongs to, but the related <code>category</code> object does
not contain any references to the products it contains.</li>
<li>Click the Foreign Key tab in the Relationship editor. You see the following display.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/foreign-key-tab.png"
class="margin-around b-all" alt="'Relationship editor - Foreign Key tab"
title="Use the Foreign Key tab to modify a relationship's ordinality and cardinality">
<br>
Under the Foreign key tab, you can modify a relationship's:
<ul style="margin: 5px 0 0 -.7em">
<li><strong>cardinality:</strong> whether the relationship between two objects
is <em>one-to-one</em> or <em>one-to-many</em>.</li>
<li><strong>ordinality:</strong> whether a reference between entities must
exist in order to maintain the integrity of the model. (Toggle the Mandatory
checkbox for either side.)</li>
<li><strong>type:</strong> (i.e., <em>identifying</em> or <em>non-identifying</em>).
A non-identifying relationship, such as this one, refers to the fact
that the child object (<code>product</code>) can be identified independently
of the parent (<code>category</code>). An identifying relationship
means that the child cannot be uniquely identified without the parent.
An example of this is demonstrated later, when you create a many-to-many
relationship between the <code>product</code> and <code>order</code> tables.</li>
</ul></li>
<li>Click the 1:n Non-Identifying Relationship (
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/one-many-btn.png"
class="b-all" alt="1:n Non-Identifying Relationship button"> ) button. In the following
steps, you create a <em>one-to-many</em> relationship between the <code>customer</code>
and <code>customer_order</code> objects.</li>
<li>Click the <code>order</code> table first (this table will contain the foreign key),
then click the <code>customer</code> table. A relationship is formed between the two
tables.</li>
<li>Click the link between the two tables, and in the Relationship editor that displays,
change the default caption to '<code>is placed by</code>'. The relationship now
reads, &quot;customer order x is placed by customer y.&quot;
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/order-customer-relationship.png"
class="margin-around b-all" alt="'Order-customer relationship displayed on EER canvas"
title="A one-to-many relationship is defined between the customer and order objects">
<br><br>
<p class="tips">You can click and drag tables on the canvas into whatever position
makes the most sense for your model. In the image above, the <code>order</code>
table has been moved to the left of <code>customer</code>.</p>
</li>
</ol>
<h4 id="manyToMany">Creating Many-To-Many Relationships</h4>
<p><em>Many-to-many</em> relationships occur when both sides of a relationship can have
numerous references to related objects. For example, imagine the Affable Bean business
offered products that could be listed under multiple categories, such as cherry ice
cream, sausage rolls, or avocado souffl&eacute;. The data model would have to account
for this by including a <em>many-to-many</em> relationship between <code>product</code>
and <code>category</code>, since a category contains multiple products, and a product
can belong to multiple categories.</p>
<p>In order to implement a <em>many-to-many</em> relationship in a database, it is necessary
to break the relationship down into two <em>one-to-many</em> relationships. In doing so,
a third table is created containing the primary keys of the two original tables. The
<code>product</code> - <code>category</code> relationship described above might look as
follows in the data model.</p>
<div class="indent">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/many-to-many.png"
class="margin-around b-all" alt="'Product-category many-to-many relationship displayed on EER canvas"
title="A many-to-many relationship is depicted as two one-to-many relationships">
</div>
<p>Now, consider how the application will persist customer orders. The <code>customer_order</code>
entity already contains necessary properties, such as the date it is created, its confirmation
number, amount, and a reference to the customer who placed it. However, there currently is no
indication of the products contained in the order, nor their quantities. You can resolve this
by creating a <em>many-to-many</em> relationship between <code>customer_order</code> and
<code>product</code>. This way, to determine which products are contained in a given order,
the application's business logic can query the new table that arises from the many-to-many
relationship, and search for all records that match an <code>order_id</code>. Because customers
can specify quantities for products in their shopping carts, we can also add a <code>quantity</code>
column to the table.</p>
<ol>
<li>In the left margin, click the n:m Identifying Relationship (
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/many-many-btn.png"
class="b-all" alt="n:m Identifying Relationship button"> ) button.
This enables you to create a <em>many-to-many</em> relationship.</li>
<li>Click the <code>customer_order</code> table, then click the <code>product</code>
table. A new table appears, named <code>customer_order_has_product</code>.
<br><br>
<p class="tips">Recall that an <em>identifying relationship</em> means that
the child cannot be uniquely identified without the parent. Identifying
relationships are indicated on the Workbench canvas by a solid line linking
two tables. Here, the <code>customer_order_has_product</code> table forms
an identifying relationship with its two parent tables, <code>customer_order</code>
and <code>product</code>. A record contained in the <code>customer_order_has_product</code>
table requires references from both tables in order to exist.</p></li>
<li>Arrange the tables according to the following image. The <em>many-to-many</em>
relationship is highlighted below.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/many-to-many-order-product.png"
class="margin-around b-all" alt="ERD containing a many-to-many relationship"
title="The 'customer_order_has_product' table contains two foreign keys to the order and product tables">
<br>
The new <code>customer_order_has_product</code> table contains two foreign
keys, <code>fk_customer_order_has_product_customer_order</code> and
<code>fk_customer_order_has_product_product</code>, which reference the
primary keys of the <code>customer_order</code> and <code>product</code>
tables, respectively. These two foreign keys form a composite primary key
for the <code>customer_order_has_product</code> table.</li>
<li>Change the name of the new <code>customer_order_has_product</code> table to
'<code>ordered_product</code>'. Double-click the <code>customer_order_has_product</code>
table to open the Table editor. Enter <code>ordered_product</code> into the Name
field.</li>
<li>Rename the foreign key indexes to correspond to the new table name. In the
<code>ordered_product</code>'s Table editor, click the Foreign Keys tab. Then,
click into both foreign key entries and replace '<code>customer_order_has_product</code>'
with '<code>ordered_product</code>'. When you finish, the two entries should read:
<ul style="margin: 5px 0 0 -.7em">
<li><code>fk_<strong>ordered_product</strong>_customer_order</code></li>
<li><code>fk_<strong>ordered_product</strong>_product</code></li>
</ul>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/ordered-product-foreign-key.png"
title="Rename the foreign key indexes under the Foreign Keys tab in the Table editor"
class="margin-around b-all" alt="Foreign Keys tab in Table editor"></li>
<li>Double-click the lines between the two objects and delete the default captions
in the Relationship editor.</li>
<li>Create a <code>quantity</code> column in the <code>ordered_product</code>
table. To do so, click the Columns tab in the <code>ordered_product</code>'s
Table editor. Enter the following details.
<table class="margin-around">
<tbody>
<tr>
<th class="tblheader" scope="col">Column</th>
<th class="tblheader" scope="col">Datatype</th>
<th class="tblheader" scope="col">NN (Not Null)</th>
<th class="tblheader" scope="col">UN (Unsigned)</th>
<th class="tblheader" scope="col">Default</th>
</tr>
<tr>
<td class="tbltd1"><code>quantity</code></td>
<td class="tbltd1"><code>SMALLINT</code></td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1">&#10003;</td>
<td class="tbltd1"><code>1</code></td>
</tr>
</tbody>
</table>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/quantity-column.png"
class="margin-around b-all" alt="Table editor - 'order_has_product' table"
title="Add a 'quantity' column to the 'order_has_product' table">
</li>
</ol>
<p>You have now completed the ERD (entity-relationship diagram). This diagram
represents the data model for the <code>AffableBean</code> application.
As will later be demonstrated, the JPA entity classes that you create will
be derived from the entities existing in the data model.</p>
<div class="indent">
<div class="indent">
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/affablebean-erd.png"
class="margin-around b-all" alt="Complete AffableBean ERD"
title="ERD for the AffableBean application">
</div>
</div>
<p class="tips">Choose View &gt; Toggle Grid to disable the canvas grid.
You can also create notes for your diagram using the New Text Object (
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/text-object-btn.png"
alt="New Text Object button"> ) button in the left margin.</p>
</div>
<br>
<h2 id="forwardEngineer">Forward-Engineering to the Database</h2>
<p>To incorporate the data model you created into the MySQL database, you can employ
WorkBench to forward-engineer the diagram into an SQL script (more precisely,
a DDL script) to generate the schema. The wizard that you use also enables you
to immediately run the script on your database server.</p>
<p><strong>Important:</strong> Make sure your MySQL database server is running.
Steps describing how to setup and run the database are provided in
<a href="setup-dev-environ.html#communicate">Setting up the Development
Environment: Communicating with the Database Server</a>.</p>
<ol>
<li>Set the default storage engine used in Workbench to InnoDB. Choose Tools &gt;
Options (MySQLWorkbench &gt; Preferences on Mac) to open the Workbench
Preferences window. Click the MySQL tab, then select InnoDB as the default
storage engine.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/inno-db.png"
class="margin-around b-all" alt="Workbench Preferences window - MySQL tab"
title="Set the default storage engine to InnoDB" style="width:688px">
<br>
The <a href="http://www.innodb.com/" target="_blank">InnoDB</a> engine provides
foreign key support, which is utilized in this tutorial.</li>
<li>Click OK to exit the Preferences window.</li>
<li>Choose Database &gt; Forward Engineer from the main menu.</li>
<li>In the first panel of the Forward Engineer to Database wizard, select
'<code>DROP Objects Before Each CREATE Object</code>', and '<code>Generate
DROP SCHEMA</code>'.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/forward-engineer-wzd.png"
class="margin-around b-all" style="width:688px" alt="Forward Engineer wizard"
title="Enable DROP options to be generated in the SQL script">
<br>
These <code>DROP</code> options are convenient for prototyping - if you need
to make changes to the schema or schema tables, the script will first delete
(i.e., <em>drop</em>) these items before recreating them. (If you attempt to
create items on the MySQL server that already exist, the server will flag an
error.)</li>
<li>Click Continue. In Select Objects to Forward Engineer panel, note that the
Export MySQL Table Objects option is selected by default. Click the Show
Filter button and note that all five tables in the <code>affablebean</code>
schema are included.</li>
<li>Click Continue. In the Review SQL Script panel, you can examine the SQL script
that has been generated based on the data model. Optionally, click Save to
File to save the script to a location on your computer.
<br><br>
<p class="notes"><strong>Note:</strong> In examining the script, you may notice
that the following variables are set at the top of the file:</p>
<div class="indent">
<pre class="examplecode" style="width:660px">
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';</pre>
<p>For an explanation of what these variables are, and their purpose in the script,
see the official Workbench manual:
<a href="http://dev.mysql.com/doc/workbench/en/workbench-faq.html" target="_blank">Chapter
11. MySQL Workbench FAQ</a>.</p></div></li>
<li>Click Continue. In the Connection Options panel, set the parameters for
connecting to the running MySQL server.
<ul style="margin: 5px 0 0 -.7em">
<li><strong>Hostname:</strong> <code>127.0.0.1</code> (<em>or <code>localhost</code></em>)</li>
<li><strong>Port:</strong> <code>3306</code></li>
<li><strong>Username:</strong> <code>root</code></li>
<li><strong>Password:</strong> <code>nbuser</code></li>
</ul>
(The parameters you set should correspond to those from <a href="setup-dev-environ.html#communicate">Setting up the Development Environment:
Communicating with the Database Server</a>.)</li>
<li>Click Execute. In the final panel of the wizard, you receive confirmation
that the wizard was able to connect to and execute the script successfully.</li>
<li>Click Close to exit the wizard.</li>
</ol>
<p>The <code>affablebean</code> schema is now created and exists on your MySQL server.
In the next step, you connect to the schema, or <em>database</em>, from the IDE. At
this stage you may ask, &quot;What's the difference between a schema and a database?&quot;
In fact, the MySQL command <code>CREATE SCHEMA</code> is a synonym for <code>CREATE
DATABASE</code>. (See <a href="http://dev.mysql.com/doc/refman/5.1/en/create-database.html" target="_blank">12.1.10.
CREATE DATABASE Syntax</a>.) Think of a schema as a blueprint that defines the contents
of the database, including tables, relationships, views, etc. A database implements the
schema by containing data in a way that adheres to the structure of the schema. This is
similar to the object-oriented world of Java classes and objects. A class defines an object.
When a program runs however, objects (i.e., class instances) are created, managed, and
eventually destroyed as the program runs its course.</p>
<br>
<h2 id="connectDB">Connecting to the Database from the IDE</h2>
<p>Now that the <code>affablebean</code> schema exists on your MySQL server, ensure
that you can view the tables you created in the ERD from the IDE's Services window.</p>
<p><strong>Important:</strong> Make sure that you have followed the steps outlined in
<a href="setup-dev-environ.html#communicate">Setting up the Development Environment:
Communicating with the Database Server</a>. This heading describes how to run the
MySQL database server, register it with the IDE, create a database instance, and
form a connection to the instance from the IDE.</p>
<ol>
<li>In the IDE, open the Services window (Ctrl-5; &#8984;-5 on Mac) and locate
the database connection node (
<img src="../../../../images_www/articles/73/javaee/ecommerce/common/db-connection-node.png"
alt="Database connection node"> ) for the <code>affablebean</code> database
instance you created in the <a href="setup-dev-environ.html#communicate">previous
tutorial unit</a>.</li>
<li>Refresh the connection to the <code>affablebean</code> database. To do so,
right-click the connection node and choose Refresh.</li>
<li>Expand the Tables node. You can now see the five tables defined by the schema.</li>
<li>Expand any of the table nodes. Each table contains the columns and indexes
that you created when working in MySQL Workbench.
<br>
<img src="../../../../images_www/articles/73/javaee/ecommerce/data-model/services-window-schema.png"
class="margin-around b-all" alt="Forward Engineer wizard"
title="Update the database connection to view schema tables"></li>
</ol>
<p>The IDE is now connected to a database that uses the schema you created for the
<code>AffableBean</code> application. From the IDE, you can now view any table
data you create in the database, as well as directly modify, add and delete data.
You will explore some of these options later, in <a href="connect-db.html">Connecting
the Application to the Database</a>, after you've added sample data to the database.</p>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20NetBeans%20E-commerce%20Tutorial%20-%20Designing%20the%20Data%20Model">Send
Us Your Feedback</a></div>
<br style="clear:both;">
<h2 id="seeAlso">See Also</h2>
<div class="indent">
<h3>NetBeans Resources</h3>
<ul>
<li><a href="../../../articles/mysql.html" target="_blank">MySQL and NetBeans IDE</a></li>
<li><a href="../../ide/mysql.html" target="_blank">Connecting to a MySQL Database</a></li>
<li><a href="../../web/mysql-webapp.html" target="_blank">Creating a Simple Web Application Using a MySQL Database</a></li>
<li><a href="../../ide/database-improvements-screencast.html" target="_blank">Screencast: Database Support in NetBeans IDE</a></li>
</ul>
<h3>MySQL & Data Modeling Resources</h3>
<ul>
<li><a href="http://wb.mysql.com/" target="_blank">MySQL Workbench Blog</a></li>
<li><a href="http://forums.mysql.com/index.php?151" target="_blank">MySQL Workbench Forum</a></li>
<li><a href="http://dev.mysql.com/librarian/" target="_blank">The MySQL Community Librarian</a></li>
<li><a href="http://dev.mysql.com/doc/workbench/en/index.html" target="_blank">MySQL Workbench Reference Manual</a></li>
<li><a href="http://dev.mysql.com/doc/refman/5.1/en/" target="_blank">MySQL 5.1 Reference Manual</a></li>
<li><a href="http://en.wikipedia.org/wiki/Innodb" target="_blank">InnoDB</a> [Wikipedia]</li>
<li><a href="http://en.wikipedia.org/wiki/Database_model" target="_blank">Database Model</a> [Wikipedia]</li>
<li><a href="http://en.wikipedia.org/wiki/Data_modeling" target="_blank">Data Modeling</a> [Wikipedia]</li>
</ul>
</div>
<br>
<h2>References</h2>
<ol>
<li id="footnote1"><a href="#fn1" style="text-decoration:none">^</a> Data Definition
Language (DDL) is a subset of the SQL language and includes statements such as
<code>CREATE TABLE</code>, <code>DROP</code>, and <code>ALTER</code>. Other subsets
include Data Manipulation Language (DML), and Data Control Language (DCL). For
more information, see <a href="http://en.wikipedia.org/wiki/Data_Definition_Language" target="_blank">Data
Definition Language</a> [Wikipedia].</li>
</ol>
</body>
</html>