Logical design is the process of modelling your data before committing to a specific database engine. You define what data exists and how it relates, without worrying about SQL syntax, data type differences between databases, or physical optimisations.
The result is a clear, technology-neutral blueprint that you can later convert into a physical schema for MySQL, PostgreSQL, SQL Server, Oracle, or any of the 80+ databases DbSchema supports.
In logical design, the terminology differs from physical design:
| Physical Design | Logical Design | Notes |
|---|---|---|
| Schema | Subject Area | |
| Table | Entity | |
| Column | Attribute | |
| Foreign Key | Relation | Identifying, Non-Identifying, Many-to-Many + Cardinality |
From the DbSchema welcome screen, choose Design from Scratch, then select Logical Design.
A blank logical diagram opens. Right-click the canvas to create your first entity.
An entity maps to a physical table and represents a real-world concept — for example, Customer, Order, or Product. Each entity has attributes (equivalent to columns) that describe its properties.
A relation connects two entities, just as a foreign key connects two tables. To create a relation, drag from an attribute in one entity to an attribute in another.
Each relation has several properties:
Identifying vs. Non-Identifying
PhonePrefix(CountryID, Prefix) depends on Country(CountryID).Resident references City.CityID but has its own primary key.Mandatory vs. Optional
Order must belong to a Customer.Cardinality
Normalization organises data to eliminate redundancy and make updates consistent. DbSchema logical design makes it easy to model normalised structures from the start.
Goal: every attribute holds a single, atomic value — no lists or repeating groups.
Problem — multi-value attributes:
OrderID | Customer | Products | Phones
101 | Alice Smith | Shoes, T-shirt | 555-1234, 555-5678
1NF solution — one value per cell:
OrderID | Customer | Product | Phone
101 | Alice Smith | Shoes | 555-1234
101 | Alice Smith | T-shirt | 555-5678
Goal: remove partial dependencies — every non-key attribute must depend on the whole primary key, not just part of it.
Problem — composite key (OrderID, Product), but Customer depends only on OrderID:
OrderID | Product | Customer | Phone
101 | Shoes | Alice Smith | 555-1234
101 | T-shirt | Alice Smith | 555-1234
2NF solution — split into two entities:
Orders: OrderID | Customer | Phone
OrderDetails: OrderID | Product
Goal: remove transitive dependencies — non-key attributes must depend only on the primary key, not on each other.
Problem — CustomerName and Phone depend on CustomerID, not on OrderID:
OrderID | CustomerID | CustomerName | Phone
101 | C001 | Alice Smith | 555-1234
3NF solution — separate the Customer entity:
Orders: OrderID | CustomerID
Customers: CustomerID | CustomerName | Phone
| Normal Form | What It Fixes | Result |
|---|---|---|
| 1NF | Repeating groups, non-atomic values | Each attribute holds one value |
| 2NF | Partial key dependencies | Attributes depend on full key |
| 3NF | Transitive dependencies | No indirect column relationships |
The naming dictionary controls how logical names are translated into physical names during conversion. For example, a logical attribute named First Name could become first_name or FIRST_NAME depending on your naming rules.
Open the naming dictionary from the Convert Model menu.
The conversion dictionary maps logical data types to physical data types for each target database. For example, the logical type Text might convert to VARCHAR(255) for MySQL and NVARCHAR(255) for SQL Server.
You can customise the mappings per database to match your conventions.
Once your logical design is complete, convert it to a physical model from Convert Model → Generate Physical Design. DbSchema applies the naming and conversion dictionaries and produces a fully editable physical schema targeting the database of your choice.
From there you can connect to a database and deploy the schema, or continue refining it with indexes, constraints, and stored procedures.