A simple tutorial on using rational rose and
UML
Michael M Werner
 2003 All rights reserved
Rational Rose Tutorial
1
2/12/2016
Introduction
Unified Modeling Language (UML) was created in 1995 by merging diagramming
conventions used by three software development methodologies: OMT by James
Rumbaugh, Objectory by Ivar Jacobson and the Booch Method by Grady Booch. Prior to
this time, these three amigos, along with about a dozen other practitioners had promoted
competing methodologies for systematic software development, each with its own system
of diagramming conventions. The methodologies followed a kind of cookbook style of
pushing a software project through a succession of life cycle stages, culminating with a
delivered and documented application. One goal of UML was to reduce the proliferation
of diagramming techniques by standardizing on a common modeling language, thus
facilitating communication between developers. It achieved that goal in 1997 when the
(international) Object Management Group (OMG) adopted it as a standard.
Some critics consider that UML is a bloated diagramming language written by a
committee. That said, I consider it to be the best means available today for documenting
object-oriented software development. It has been and is becoming increasingly used in
industry and academia.
It should be stressed that UML is not a methodology, rather it is a language for
expressing software models. Conceivably, it can be used with various software
methodologies. However, separately from the UML, the three amigos have developed
the Rational Unified Process, a methodology that is use case driven, and carried out using
UML models.
Rational Rose is a Computer Aided Software Engineering (CASE) tool developed by the
Rational Corporation under the direction of Booch, Jacobson and Rumbaugh to support
software development using UML. Rational Rose is necessarily complex owing to its
mission of fully supporting UML. In addition, Rational Rose has numerous language
extensions to Ada, C++, VB, Java, J2EE, etc. Rational Rose supports forward and
reverse engineering to and from these languages. On the other hand, Rational Rose does
not support some traditional design techniques as data flow diagrams and CRC cards,
since these are not part of UML.
Because Rational Rose has so many capabilities it is a daunting task to master it.
Fortunately, a lot can be done using just a small subset of these capabilities. These notes
are designed to introduce novice developers into making productive use of such a subset.
They reflect the author’s bias towards developing software and should not be taken as the
last word on the subject.
Rational Rose Views Related to the Software
Development Life Cycle
Rational Rose models have these four views:
Rational Rose Tutorial
2
2/12/2016
1.
2.
3.
4.
Use Case View
Logical View
Component View
Deployment View
I like to use a Software Development Life Cycle with these phases:
0. Project Initiation
1. Requirements
2. Design
2.1
Architectural Design
2.2
Detail Design
3. Implementation
4. Maintenance
0. Project Initiation
The project initiation phase involves identifying a problem that need a software solution,
investigating to see if an adequate solution is already available for purchase, if not,
working up an informal proposal outlining new software to be built and making the case
that the expected benefits justify the cost. Rational rose need not be involved in this
phase.
1.
Requirements
The requirements phase involves eliciting requirements from the client and presenting
them in a formal contractual document that will later serve as the basis for acceptance of
the finished project. Getting the requirements right is key to the success of the project.
However, the software developers are usually not expert on the client’s business
environment, nor are the clients necessarily good at expressing what their real
requirements are. The developers need to work with the clients to determine the real
requirements.

Use Case Diagram - The best tool I know of for talking about requirements is the
use case diagram, developed by Jacobson. The diagrams and the use case
technique are so simple that clients instantly relate to them and will readily
volunteer usual and exceptional scenarios to go along with each use case. The use
cases are recorded in the use case view of rational rose.
Some other diagrams strictly speaking belong to the design phase, but may also be useful
in the requirements phase. They are constructed in Rational Rose’s Logical View.
Rational Rose Tutorial
3
2/12/2016

Class Diagram – As part of the requirements process entity classes are identified
and described in terms of attributes, operations and associations using the UML
class diagram. A class is an entity class if it forms part of the client’s business
model. So, for example, if the client is running a hospital, possible entity classes
are: Patient, Doctor, Nurse, Therapist, Bed, Treatment, Diagnosis, etc. On the
other hand, classes such as Form, Canvas, Button, Socket, etc. are not entity
classes. They are classes needed to implement the solution, but are not
meaningful in describing the client’s business, hence not part of the requirements
phase.
Another way to look at entity classes is from a database point of view. The entity
classes are usually the persistent ones, i.e. they describe the objects, which the
system will permanently track in a database.

Sequence Diagram (Logical View)– Object-Oriented systems get work done by
sending messages between objects, invoking functions to obtain services.
Sequence diagrams are designed to help visualize the messaging. Each use case
results in one or more sequence diagrams, a main sequence diagram to illustrate
the usual scenario for the use case and zero or more additional sequence diagrams
to illustrate exceptional scenarios. One or two sequence diagrams are appropriate
in the requirements phase; they are helpful in refining and adding to use cases,
and discovering entity classes. The bulk of sequence diagrams belong to the
design phase.

Component and Deployment diagrams are primarily used in the architectural
design phase. They show the division of software responsibilities into software
components or modules, and the deployment of modules to various devices.
However, for some projects such as web applications, client-server and multitiered configurations, etc. these issues are so important that the developer may
wish to discuss them with the client during requirements analysis. In Rational
Rose, these diagrams properly belong in the Component and Deployment views,
respectively.
2.1
Architectural Design
The architectural design phase is used to divide up system responsibilities into
subsystems. The subsystems (modules) are identified, responsibilities assigned to them,
and interfaces between modules are specified. A general scheme for the software
architecture is chosen. For example: client/server, layered services, model-viewcontroller, etc. The data model is refined including levels of access for different actors.
The following UML diagrams are useful at this stage:
 Class Diagram (Logical View) – Classes are grouped into packages representing
subsystems.
Rational Rose Tutorial
4
2/12/2016


2.2
Component Diagram (Component View) – Components and interfaces are
defined.
Deployment Diagram (Deployment View) – Software components are mapped to
hardware components.
Detail Design
The modules identified in architectural design need to be fully specified prior to
implementation.
The following UML diagrams are useful at this stage:
 Class Diagram (Logical View) – Entity classes were identified by analyzing the
problem space during the requirements phase. These are now supplemented with
additional solution classes needed to build interfaces, maintain persistent data,
manage communications, etc.
The expanded class diagram is reexamined to take advantage of factoring out
common behavior into abstract superclasses, simplify associations and otherwise
make the design more cohesive.

Sequence Diagram (Logical View) – A complete set of sequence diagrams is now
drawn for each of the use cases identified as requirements. As mentioned earlier,
each use case has a usual scenario and perhaps several exceptional scenarios.
Rather than attempt to show branching in the sequence diagrams, usually a
separate diagram is drawn for each scenario.

Statechart Diagram (Logical View) – The state of an object is the current set of
values of all its attributes (including inherited ones). Objects may change state in
response to messages received. The statechart diagram shows all the states,
transitions between states labeled by the messages, which cause them, and guards
on transitions.
Activity Diagram (Logical View) – These diagrams are similar to the familiar
flowcharts. They show activities (processes) and the flow of control and data
between activities.

Together the sequence, statechart and activity diagrams form the dynamic model of the
system. In general, the system is at rest until an actor initiates a use case by requesting a
system function. This causes a flurry of messages and state changes as predicted by the
dynamic model.
3.
Implementation
In the implementation phase the detailed design is actually carried out in program code
using a target language. Data definition language is written to create and populate the
database tables and grant role-based privileges. Reports and interactive forms are
written, as well as help files and exception handling routines.
Rational Rose Tutorial
5
2/12/2016
The implementation phase is characterized by testing, unit tests to see if individual
modules work correctly, integration tests to ensure that the modules work together
properly to carry out the use cases. Tested modules are deployed to the target hardware
and retested on site. Finally, acceptance testing verifies that the system carries out its
various functions correctly, i.e. according to their specification in the requirements
document.
Rational Rose provides extensive support for implementation:


4.
Model checking.
Forward code generation (from model to source code) in a variety of target
languages.
Maintenance
Rational Rose Tutorial
6
2/12/2016
Using Rational Rose and UML to Build a Library
Circulation System
The Problem:
A public library would like to automate some of its circulation functions. Machines will
be purchased so that library customers will be able to check out and return books on their
own. As with any library, customers will first need to be approved for a library card.
Cardholders will be assigned (or select) a username and password. To borrow a book, a
cardholder enters her username and password, then scans each book they wish to borrow.
The books are desensitized. When done, the cardholder presses submit, which logs them
off and opens a turnstile gate so they can leave. A similar process is followed when
returning a book. The cardholder logs on, scans the books for return, and logs off.
Cardholders may also reserve books using a WWW interface and pay fines or other fees
by logging on and using a credit card or payment service. They can request reports on
books they currently have on loan and books they have borrowed in the past.
Circulation librarians can send reminders to cardholders, create a variety of reports to
track borrowers, books, loans, etc. and levy fines. Acquisitions librarians acquire new
books and add them to the system. Likewise they may dispose existing books and
remove them from the system. They can generate reports on loans and reservations to
help guide their decisions.
Step 1 – Create a use case diagram in Rational Rose
Start Rational Rose.
Rational Rose Tutorial
7
2/12/2016
Choose a default language. This is the language you plan to develop in. I chose J2EE,
since I plan to make a Java application. This is the browser window. You will create a
model by adding various artifacts such as use cases, diagrams, classes, etc. to it. All
artifacts are accessible from the browser whether they are shown in diagrams or not.
Note that the browser window also shows the four rational rose views, discussed earlier.
The model properties are the settings for generating code in the various target languages.
You can double click the icon in the browser window to change these, or select Model
Properties from the Tools menu.
Rational Rose Tutorial
8
2/12/2016
Creating the use case view:
It is convenient to group model artifacts into packages. Since the target language in this
case, Java, directly supports packages this is a good idea. Right-clicking on package
icons in the browser brings up the new menu, which allows creating various new artifacts
in the package.
Create a new package and name it Circulation. Add actors and use cases to the
circulation package by right clicking on the package name and choosing new. Each actor
and use case should be described in the documentation window, usually located in the
lower left of your screen. Add a new use case diagram to the Circulation package, name
it Main, and drag actors and use cases onto it. Choose the unidirectional association tool
and drag from the actor to the use case. Now create a use case diagram for the library
circulation system.
Start with typical usages such as borrowing and returning a book. Identify the actors
involved, for example library cardholders and circulation librarians. Think of the
different titles we use for librarians and whether their job descriptions include using the
library circulation system in some way. Don’t neglect boundary conditions. These
include startup, shutdown and handling exceptions. How will new books be entered into
the system and old ones removed? Usually an acquisitions librarian is in charge and
will have use cases for acquiring and disposing of books. Similarly, think of how library
users will apply for and be issued library cards, and possibly lose borrowing privileges if
they fail to comply with library rules. Here is a sample use case diagram.
Rational Rose Tutorial
9
2/12/2016
Cardholder
UpdateProfile
Borrow
Reserve
Renew
Login
Return
PayFee
Circulation Librarian
Acquisitions
Librarian
AcquireBook
Manage Card Holders
GetReports
DisposeBook
FineCardHolder ApproveLibraryCard
Remind
Public User
SuspendLibraryCard
ApplyForCard
BrowseTitles
No code will be generated from the use cases so don’t agonize over getting them exactly
right. UML provides for <<include>> and <<extend>> associations between use cases.
The << … >> notation stands for a UML stereotype. <<include>> is a standard
stereotype to indicate that one use case, say Login, is included as a common part of other
Rational Rose Tutorial
10
2/12/2016
use cases. <<extend>> is used to handle exceptional conditions. Here is a diagram
illustrating use case associations.
The dotted arrows are used for dependencies between use cases. Double clicking on an
arrow brings up its specification window. You can choose a standard stereotype or type
in a new one. This is part of UML’s extensibility feature.
Bear in mind that the main purpose of use cases is to be able to review them with your
client so as to get the requirements right. Later we will see that they play a role in
discovering domain classes and in drawing class and sequence diagrams.
Scenarios
A scenario is basically a flow of events that occur when a use case is carried out. The
scenario should have entry and exit conditions, plus a list of steps that are followed.
Associated with each use case is the usual scenario if everything goes right and several
exceptional scenarios followed if something goes wrong. Rational Rose does not supply
specific support for storing scenarios. There are thus two choices: (1) Write the scenarios
in the documentation window for the use case, or (2) attach a file to the use case
containing the scenarios. Keep the language simple so that your clients can understand
and work with you on the scenarios. Here is an example of writing the scenarios for the
borrow use case in the documentation window.
Rational Rose Tutorial
11
2/12/2016
By the way, it is time to save your model if you haven’t already done so. Choose Save
As from the file menu, and specify a name and location. This will also give a name to the
model.
Step 2 – Create a class diagram in Rational Rose
Even though you are still in the Requirements Phase of development, it is appropriate to
start creating a class diagram. The initial classes are so-called entity classes, that is
classes that correspond to entities in your client’s business model. So, for a library
circulation system the entity classes will include Book, Cardholder, Loan, etc. Later on,
in the Design Phase, the entity classes will be supplemented with solution classes.
In Rational Rose, class diagrams form part of the logical view. As before, we will group
the entity classes in a package. Right click on the Logical View, create a new package
and name it Circulation. Drag the Circulation package into the Package Hierarchy
diagram, where it joins other packages such as java and javax, which were placed there
when you chose to build a J2EE application.
Rational Rose Tutorial
12
2/12/2016
Add classes to the Circulation package by right clicking on the package name and
choosing new. Add a Class Diagram to the Circulation package, and label it Main,
 Add a class for each entity object in the library circulation system.
 Add attributes to each class by right-clicking on the class and pressing new. You
can follow the attribute name by a colon and a type as in: balance:double.
Alternatively, you can open the specification for the attribute to assign a Java type
to it. Although the Type field is grayed, you can click on the … button and bring
up the Select a type window.
Rational Rose Tutorial
13
2/12/2016


Add operations. Open the specification for each operation to add parameters to it.
Add associations between classes. Open the specification for each association. It
is important to add multiplicities and role names for each association using the
tabs entitled “Role A detail” and “Role B detail”. The role names will be used in
code generation.
I created the following class diagram for the library circulation system.
Rational Rose Tutorial
14
2/12/2016
Step 3 – Create sequence diagrams in Rational Rose
Like class diagrams, sequence diagrams are placed in the logical view. Remember the
use case scenarios from the use case view. It is now time to express each of these
scenarios in terms of message passing between objects belonging to classes described in
the class diagram(s). Properly, sequence diagrams belong to the design phase, since we
are beginning to talk about the solution space, rather than the problem space. However, it
is appropriate to include one or two sequence diagrams in the requirements phase.
In the browser, right-click on the Circulation package to add a new sequence diagram.
To illustrate, I will draw a sequence diagram for the borrow use case – usual scenario.
Drag the Cardholder actor into the diagram from the use case model. Now drag in
needed objects from the classes defined in the Circulation package. Create messages
with the Object Message tool, dragging from the source object to the target. The message
name and signature should match with an operation available in the target class, in fact
right-clicking on a message arrow reveals a list of target class operations to choose from.
Alternatively, you can add a new operation to the target class. It will show up in the class
diagram.
Rational Rose Tutorial
15
2/12/2016
: Cardholder
: Cardholder
: LoanControl
: Loan
: Title
: Book
borrowBook(String, int)
recordBorrow(String, int)
Loan( String, int)
adjustAvailable()
borrow(Loan)
Receipt
Borrow Book Sequence Diagram M Werner Feb '03
Sequence diagram showing messaging involved in borrowing a book. The
flesh and blood cardholder logs on to the system activating her Cardholder
surrogate object. The Cardholder checks to see if it is in good standing. If so
it sends a borrow message to the waiting LoanControl process along with
book id information scanned from a bar code. The LoanControl takes charge,
creating a Loan object to record the loan, sending a reference to the loan
object to the Book object, decrementing the copiesAvailable count in the Title
object, and finally printing a loan receipt for the cardholder.
Use Case
Diagram:
Circulation / Main
Class Diagram:
Circulation / Main
Discussion of control classes here
Step 4 – Create statechart diagrams in Rational Rose
Rational Rose Tutorial
16
2/12/2016
State Chart for a Book.
-M Werner
New books wait
to be shelved
/ sticker affixed
OnShelf
shelve[ (good condition) ]
borrow
OnLoan
return
Waiting
Shelving
discard[ Poor condition ]
Books in poor
condition are placed
in a discard pile.
Discard
Step 5 – Java Code Generation in Rational Rose
The first step in code generation is to make sure the default language has been set to Java.
It should show in the bottom right of your screen. To change the default language, go to
the Tools > Options > Notation tab.
The Component View.
Java public classes are customarily placed in a .java source file, which has the same name
as the class. These source files match up with Rose components. Rational Rose can
automatically create components for you when you are ready to generate code.
Alternatively, you can create your own components and in the browser, drag classes into
them. You need to do this for non-public java classes.
For the Library application it is natural to carry over the packages from the logical view.
So, add a package named Circulation to the component view. When you generate code
from a class for the first time, you will create a component for it in the Circulation
package.
Rational Rose Tutorial
17
2/12/2016
Setting Java Properties.
The java code that is generated depends on the settings of the java properties for the
model. You can double-click the Model Properties from the browser window or choose
Tools > Model Properties > Edit from the menu. Select the Java tab. In the Type
window, choose the artifact you wish to set properties for. Here is the window when
Attribute is selected.
The only change I made on this screen was to change PropertyType to Simple. This is a
bean property. Simple means that get and set methods are generated for each attribute. I
made the same change for the Role type. Recall that the role names you specified in the
class diagram are used as field names in the generated code. (Assuming the association
ending was marked Navigable). When the role has multiplicity 0..n the type of the field
is a container. By default it is an array of the target type, but I changed the Container
Type to Vector.



Create a component for each Java class in the Component view.
Drag each class into its component
Set the Java properties. To do this go to Tools | Model Properties | Edit. Go to
the Java tab. Set properties for class, role, etc.
Rational Rose Tutorial
18
2/12/2016
Creating the Data Model
Rational Rose is capable of generating a database schema from a logical view package.
This is done using the data modeler tool. The database schema can then be forward
engineered to generate Data Definition Language (DDL) appropriate to the database of
your choice.
Preparing the classes
Identify which classes you want to be persistent. Generally these are the entity classes.
In the Library example classes such as Book, Title, Cardholder, Loan, Reservation are
persistent, since we would like a permanent record of all their objects kept in the
database. Control classes such as LoanControl are not persistent. They are created to
orchestrate use cases and can be disposed of when the use cases complete. Similarly
boundary classes, which house interface forms and scripts need not be persistent.
To mark a class as persistent, right-click on the class in the browser and open the
standard specification. On the details tab, check persistent.
Rational Rose Tutorial
19
2/12/2016
The persistent classes will be converted into database tables. Each such table will need a
primary key. To enable joins the primary key field in one table may appear as a foreign
key in one or more related tables.
There are two approaches:
1)
Designate a unique attribute or attribute combination to be the primary key. For
example, in the Title class, the isbn number is a good choice for primary key,
since it uniquely identifies the book title and is commonly used for that purpose
when searching for a book. In the Book class, the combination (concatenation) of
isbn and copy number makes a natural primary key. However, there is a cost to
doing this. The isbn needs to be saved as a character string, which takes up more
space than a simple integer. The space issue is even worse in the Loan table,
which will need to store both the isbn and the copy number to recognize the
relationship of a loan to a specific book. Another problem is that joins between
related tables may be slower, since string comparisons take longer than integer
comparisons, and comparisons of concatenated keys take longer still.
2)
Allow the data modeler to generate a new integer-valued primary key id for the
table. Although these auto-generated id’s are not meaningful to end-users, they
do save space and make for fast joins.
To designate an attribute to be part of the primary key, right-click on the attribute in the
browser, select Data Modeler, part of Object Identity.
You now need to set up a database component. Right-click on the Component View
icon, select Data Modeler | New | Database.
Rational Rose Tutorial
20
2/12/2016
Next you need to choose a database language for the database. Double-click on the diskshaped icon (probably named DB_!) to open its specification, and select the target
DBMS.
Next, create a schema. Right-click the Logical View icon, select Data Modeler | new |
Schema. A Schemas package and under it a schema named S_0 are created.
Open its specification and rename it to Circulation. Choose DB1 as its database.
Next, transform the Circulation package in the logical view to a data model. Right-click
the package, select Data Modeler | Transform to Data Model. In the dialog box, select
the schema and target database.
Rational Rose Tutorial
21
2/12/2016
When you click OK, the tables are generated:
Right-click on the Circulation schema in the browser, select Data Modeler | New | Data
Model Diagram. Rename the diagram to Main. Open it up and drag all the tables into it.
Drag them around to improve readability. You get something like:
Rational Rose Tutorial
22
2/12/2016
Transforming the object model to the data model
In examining the data model above, notice that the following transformations have taken
place:
1) An integer-valued ID field was generated for every table that did not have a primary
key.
2) 1:n relationships were recognized by adding a foreign key to the table on the n side, to
match the primary key of the table on the 1 side.
3) The inheritance association between Cardholder and Person was recognized by having
the ID field serve both as a primary key in Cardholder and a foreign key pointing to a
unique person object.
Rational Rose Tutorial
23
2/12/2016
Now generate DDL for use in creating the schema:
Right-click on the Circulation schema icon. Select Data Modeler | Forward Engineer to
bring up the Forward Engineering wizard. You can accept the defaults. The main thing
is to choose a name and location for the DDL file. You can open he generated file in a
text editor. I got the following:
CREATE TABLE T_Title (
isbn VARCHAR ( 255 ) NOT NULL,
bookTitle VARCHAR ( 255 ) NOT NULL,
author VARCHAR ( 255 ) NOT NULL,
copiesAvailable INT NOT NULL,
T_Title_ID INT IDENTITY NOT NULL,
CONSTRAINT PK_T_Title24 PRIMARY KEY NONCLUSTERED
(T_Title_ID)
)
GO
CREATE TABLE T_Librarian (
T_Person_ID INT NOT NULL,
CONSTRAINT PK_T_Librarian28 PRIMARY KEY NONCLUSTERED
(T_Person_ID)
)
GO
CREATE TABLE T_BookEJB (
copyNum INT NOT NULL,
EJB_Context SMALLINT NOT NULL,
T_BookEJB_ID INT IDENTITY NOT NULL,
T_Title_ID INT NOT NULL,
CONSTRAINT PK_T_BookEJB23 PRIMARY KEY NONCLUSTERED
(T_BookEJB_ID)
)
GO
CREATE TABLE T_Loan (
borrowDate SMALLINT NOT NULL,
returnDate SMALLINT NOT NULL,
loanNumber INT NOT NULL,
T_Loan_ID INT IDENTITY NOT NULL,
Rational Rose Tutorial
24
2/12/2016
T_BookEJB_ID INT NOT NULL,
T_Person_ID INT NOT NULL,
CONSTRAINT PK_T_Loan25 PRIMARY KEY NONCLUSTERED
(T_Loan_ID)
)
GO
CREATE TABLE T_Cardholder (
accountBalance FLOAT ( 64 ) NOT NULL,
T_Person_ID INT NOT NULL,
CONSTRAINT PK_T_Cardholder27 PRIMARY KEY NONCLUSTERED
(T_Person_ID)
)
GO
CREATE TABLE T_Reservation (
reserveDate SMALLINT NOT NULL,
T_Reservation_ID INT IDENTITY NOT NULL,
T_Title_ID INT NOT NULL,
T_Person_ID INT NOT NULL,
CONSTRAINT PK_T_Reservation26 PRIMARY KEY NONCLUSTERED
(T_Reservation_ID)
)
GO
CREATE TABLE T_Person (
username VARCHAR ( 255 ) NOT NULL,
password VARCHAR ( 255 ) NOT NULL,
name VARCHAR ( 255 ) NOT NULL,
id VARCHAR ( 255 ) NOT NULL,
T_Person_ID INT IDENTITY NOT NULL,
CONSTRAINT PK_T_Person20 PRIMARY KEY NONCLUSTERED
(T_Person_ID)
)
GO
CREATE INDEX TC_T_BookEJB306 ON T_BookEJB (T_Title_ID)
GO
CREATE INDEX TC_T_Loan304 ON T_Loan (T_BookEJB_ID)
GO
CREATE INDEX TC_T_Reservation308 ON T_Reservation (T_Title_ID)
GO
ALTER TABLE T_Librarian ADD CONSTRAINT FK_T_Librarian30 FOREIGN KEY
(T_Person_ID) REFERENCES T_Person (T_Person_ID)
Rational Rose Tutorial
25
2/12/2016
GO
ALTER TABLE T_BookEJB ADD CONSTRAINT FK_T_BookEJB25 FOREIGN KEY
(T_Title_ID) REFERENCES T_Title (T_Title_ID)
GO
ALTER TABLE T_Loan ADD CONSTRAINT FK_T_Loan24 FOREIGN KEY
(T_BookEJB_ID) REFERENCES T_BookEJB (T_BookEJB_ID)
GO
ALTER TABLE T_Loan ADD CONSTRAINT FK_T_Loan27 FOREIGN KEY
(T_Person_ID) REFERENCES T_Cardholder (T_Person_ID)
GO
ALTER TABLE T_Cardholder ADD CONSTRAINT FK_T_Cardholder29 FOREIGN
KEY (T_Person_ID) REFERENCES T_Person (T_Person_ID)
GO
ALTER TABLE T_Reservation ADD CONSTRAINT FK_T_Reservation26 FOREIGN
KEY (T_Title_ID) REFERENCES T_Title (T_Title_ID)
GO
ALTER TABLE T_Reservation ADD CONSTRAINT FK_T_Reservation28 FOREIGN
KEY (T_Person_ID) REFERENCES T_Cardholder (T_Person_ID)
GO
It is a good idea to record the name of the file in the documentation for the schema.
Rational Rose Tutorial
26
2/12/2016