Skip to content

Conceptual Modeling

Say what the business means, before you say how it is stored

A logical data model answers how information is structured: which entities exist, which attributes they carry, what datatype each one has. That is the right level for generating something, but it is the wrong level for agreeing with the business what you are even talking about.

A conceptual data model answers the earlier question. It names the things the business cares about and how they relate, and it stops there. Its attributes deliberately have no datatypes, no lengths and no identifiers, because none of that is decided yet. A concept is not a half-built logical entity; it is a different kind of statement.

The two are then linked. A logical entity declares which concept it realizes, so you can look at a warehouse table and trace it back to the business idea behind it, or start from a concept and ask which physical structures implement it.

In this tutorial you will build a small conceptual model for BrightGreen Electronics and connect the existing data warehouse model to it.

What you will learn

  • Creating a conceptual data model and how it differs from a logical one
  • Adding conceptual entities, attributes and relationships
  • Declaring a dependency so one model can reference another
  • Linking logical entities and attributes to the concepts they realize

Before you start

This tutorial assumes you have completed Datamodeling Fundamentals, or are at least comfortable with the Model Explorer and the form editor.

Clone the BrightGreen workspace as described in Getting the workspace for a tutorial. It already contains the Example DWH logical model, which you will link to your concepts in the last step.

Want to see the finished result?

Clone examplesdata-modelingconceptual into a second workspace to compare your work against the completed model.

The scenario

BrightGreen's data warehouse has grown organically. There is a Customer entity in the warehouse, another in the webshop source system, and a third in the finance package. Everyone agrees they are "customers", and nobody has written down what a customer actually is for BrightGreen, or how that idea relates to an order.

You have been asked to capture that shared vocabulary as a conceptual model, and to record which warehouse structures realize which concept.

Exercise one: build the conceptual model

1 - Create a conceptual data model

In the Model Explorer, use the New Data Model... button in the toolbar.

In the form that appears, set:

Field Value
Name BrightGreen Concepts
Type Conceptual

The Type dropdown on a new data model, offering Conceptual and Logical

Save with ++ctrl+s++.

The saved data model with Type set to Conceptual

The Type dropdown is the whole decision. Picking Conceptual tells CrossModel that everything inside this model is a concept, and the application adapts accordingly: the objects you can create, the fields on their forms, and the file extension all follow from it.

Conceptual files use the .ccm extension

A logical entity is stored as Customer.entity.cm; a conceptual one as Customer.entity.ccm. The extra c is what tells CrossModel to read the file as a concept rather than as a logical entity, which is why you never need a different keyword inside the file itself.

2 - Add the Customer concept

Right-click your new data model and choose New Element → Entity....

Notice what that submenu offers: Entity... and Relationship..., and nothing else. In a logical model the same menu also offers Mapping and System Diagram. The menu is filtered by the kind of model you are in, so you cannot accidentally create something that has no meaning at the conceptual level.

New Element offers only Entity and Relationship in a conceptual model

Name the entity Customer and give it a description such as "Someone who has bought from BrightGreen, in any channel." Save.

The conceptual entity form

3 - Add attributes, and notice what is missing

Expand the Attributes section and press Add Attribute. Add two:

Name Description
Customer Name The name the customer is known by
Contact Details How BrightGreen reaches the customer

The grid has columns for Name, Type and Description. Compare that with a logical entity, where the same grid also carries Datatype, Length, Precision, Scale and the identifier and mandatory flags.

The conceptual attribute grid: Name, Type and Description only

That absence is the point. Whether a customer name is a VARCHAR(100) or a TEXT is a logical decision, and making it here would be pretending to know something you have not decided yet.

Type means type definition, here as everywhere else

There is a Type column on a conceptual attribute, and it is not a stand-in for the missing datatype. It is the same field a logical entity, a relationship or a data model carries: a reference to an object definition that supplies extra properties and house standards. Leave it empty until you have definitions worth pointing at.

4 - Add the Order concept

Repeat step 2 for a second entity:

Field Value
Name Order
Description Something a customer asked BrightGreen to supply

Give it one attribute, Order Reference.

5 - Relate the two concepts

Right-click the data model again and choose New Element → Relationship....

The form opens with a placeholder name, <Parent> to <Child>, and two collapsible sections, Parent end and Child end. Each holds three fields: the entity itself, a role, and a cardinality.

Fill them in like this:

Section Field Value
Parent end Parent Customer
Parent end Parent Cardinality 1..1
Child end Child Order
Child end Child Cardinality 0..N

The conceptual relationship form with Parent end and Child end

Read together, that says a customer places zero or more orders and an order belongs to exactly one customer. The Role fields are free text for when the plain entity names do not carry enough meaning, for example a parent role of places.

Notice what the form does not offer: anywhere to say which attribute joins to which. A logical relationship needs that, because it has to resolve to a real join. Concepts relate as wholes, and the join columns are a logical concern.

You now have a small, complete conceptual model: two concepts and the relationship between them.

Exercise two: connect the logical model to the concepts

A vocabulary nobody references is just a document. The value appears when the warehouse can point at it.

6 - Declare the dependency

Open the Example DWH data model, expand Dependencies, and press Add Dependency. Choose BrightGreen Concepts and version 1.0.0. Save.

BrightGreen Concepts added to the Example DWH dependency list

This step is easy to skip and impossible to work around, so it is worth understanding rather than just performing.

CrossModel will not let one model reference another that it has not declared a dependency on. Until this dependency exists, the Realizes field in the next step is an empty dropdown with nothing to choose, which looks like a broken control but simply means nothing is in scope. The same mechanism is why Example DWH's entities can already use type: dwh-definitions.Formal_entity: that model is in its dependency list too.

The empty-dropdown rule

Any CrossModel dropdown that references another object is populated from what the current model can see: its own contents, plus everything reachable through its declared dependencies. An empty dropdown almost always means a missing dependency rather than a missing feature.

7 - Record what the warehouse realizes

Open the Customer entity in Example DWH. Its form now has a Realizes field directly under Type. Set it to your conceptual Customer.

The Realizes dropdown offering the conceptual Customer

The dropdown now has something in it, which is the dependency doing its job.

Realizes set on the logical Customer entity

Realizes exists at both levels, so do the same one level down: open the Name attribute and point it at the Customer Name concept attribute.

Pick the attribute that genuinely corresponds. Id is a surrogate key the warehouse invented for itself, and it realizes nothing - no concept ever asked for it. Leaving it unlinked is the correct answer, and a useful one: the attributes with no counterpart are exactly the ones that exist for technical reasons rather than business ones.

References are qualified by the data model they come from, so what gets written is BrightGreen_Concepts.Customer for the entity and BrightGreen_Concepts.Customer.CustomerName for the attribute.

The form and the file spell it differently

The form shows BrightGreen Concepts.Customer and the file stores BrightGreen_Concepts.Customer. Nothing is wrong: the form displays the model's name and the file records its id. Which one you see is controlled by the display-label setting described in the user interface article.

Note the direction. The link lives on the logical side, pointing up at the concept. That is deliberate: one concept can be realized by many logical entities, which is exactly BrightGreen's problem. The webshop Customer, the finance Customer and the warehouse Customer can all realize the same idea, and "which structures implement this concept" is then a question you can answer.

If you hand-edit the code editor, field order matters

Everything above is easiest in the form editor, which writes fields in the order the model expects. If you switch to the Code Editor and add realizes to an attribute by hand, it has to sit after description and before datatype. Put it further down and the file fails to parse with Expecting token of type 'DEDENT' but found 'realizes', which does not hint that position is the problem.

Wrapup

You have built a conceptual model and connected a logical model to it. The vocabulary now lives in the workspace rather than in someone's head, and each warehouse structure records which idea it implements.

The pieces you used are worth naming, because they recur:

  • Type on a data model decides which tier you are working in, and everything else follows from it.
  • Dependencies decide what a model can see. Empty reference dropdowns are almost always a missing dependency.
  • Realizes links logical to conceptual, at both entity and attribute level, and always from the logical side.

Conceptual models are edited in forms, not diagrams (as of v1.10.0)

Conceptual models are authored through the Model Explorer and the form editor. A diagram canvas for the conceptual tier is planned for a future release; when it arrives, this tutorial will gain a section on it. Logical models have had a system diagram all along.

Where to go next