Reference · ER diagram symbols

Crow's foot notation: the 4 cardinality marks and how to read them

In short

Crow's foot notation shows how many rows of one entity can relate to one row of another using two marks at each end of the relationship line. The inner mark (nearer the middle) is the minimum — a circle o for zero or a bar | for one. The outer mark (touching the entity) is the maximum — a bar for one or the three-pronged “crow's foot” for many. That gives exactly four line ends: exactly one ||, zero or one o|, one or many |{ and zero or many o{. Read each end as “how many of the entity it touches, per one instance of the entity at the other end”. The one-to-many symbol is therefore || on the parent and o{ on the child.

Updated · by the ChartCraft team

What are the four crow's foot cardinality marks?

Three glyphs — bar (one), circle (zero) and crow's foot (many) — combine into four line ends, each a (minimum, maximum) pair. The outer glyph touches the entity and gives the maximum; the inner glyph gives the minimum.

MarkReads asMin, maxMermaid (left end / right end)
Exactly one(1, 1)|| / ||
Zero or one(0, 1)|o / o|
One or many(1, N)}| / |{
Zero or many(0, N)}o / o{

The three glyphs the marks are built from

GlyphNameMeaningPosition
Bar |OneOuter: maximum one. Inner: minimum one (mandatory).
Circle oZeroInner only: minimum zero (optional).
Crow's foot { / }ManyOuter only: maximum many. The three prongs touch the entity.

The notation is also called Information Engineering (IE) notation, after James Martin's method; the “crow's foot” name comes from Gordon Everest's 1976 description of the many-end as an inverted arrow with three prongs. The marks are the same in Barker notation (used by Oracle Designer), except that Barker draws optionality as a dashed half-line instead of a circle.

What do all 16 combinations of crow's foot marks mean?

Four possible ends on each side give 16 line types. Eight are distinct relationships; the other eight are the same relationship read from the other entity. The Mermaid column is the exact erDiagram syntax: left-end code, two dashes, right-end code.

A endB endReads asTypeMermaidExample
|| exactly one|| exactly oneEach A has exactly one B; each B has exactly one A1:1PERSON ||--|| PASSPORT_RECORDEvery person row has exactly one passport-record row and vice versa — usually one table split for security or size.
|| exactly oneo| zero or oneEach A has zero or one B; each B has exactly one A1:1CUSTOMER ||--o| DEFAULT_ADDRESSA customer may have one default address; each default address belongs to exactly one customer.
|| exactly one|{ one or manyEach A has one or many B; each B has exactly one A1:NORDER ||--|{ ORDER_LINEAn order has at least one line; each line belongs to exactly one order.
|| exactly oneo{ zero or manyEach A has zero or many B; each B has exactly one A1:NCUSTOMER ||--o{ ORDERThe classic one-to-many: a customer places zero or many orders; every order has exactly one customer.
|o zero or one|| exactly oneEach A has exactly one B; each B has zero or one A1:1PARKING_SPACE |o--|| EMPLOYEEEach employee has at most one space; a space that exists is assigned to exactly one employee.
|o zero or oneo| zero or oneEach A has zero or one B; each B has zero or one A1:1EMPLOYEE |o--o| LAPTOPOptional on both sides — an employee may have a laptop, a laptop may be unassigned.
|o zero or one|{ one or manyEach A has one or many B; each B has zero or one A1:NMANAGER |o--|{ EMPLOYEEEvery employee has zero or one manager; a manager manages one or more employees.
|o zero or oneo{ zero or manyEach A has zero or many B; each B has zero or one A1:NCATEGORY |o--o{ PRODUCTA product may be uncategorised; a category may be empty.
}| one or many|| exactly oneEach A has exactly one B; each B has one or many AN:1ORDER_LINE }|--|| ORDERThe ORDER ||--|{ ORDER_LINE row written from the other side.
}| one or manyo| zero or oneEach A has zero or one B; each B has one or many AN:1EMPLOYEE }|--o| MANAGERThe MANAGER |o--|{ EMPLOYEE row from the other side.
}| one or many|{ one or manyEach A has one or many B; each B has one or many AM:NCOURSE }|--|{ STUDENTEvery course has at least one student and every student takes at least one course — resolved through a junction table.
}| one or manyo{ zero or manyEach A has zero or many B; each B has one or many AM:NTAG }|--o{ ARTICLEA tag exists only if used by at least one article; an article may have no tags.
}o zero or many|| exactly oneEach A has exactly one B; each B has zero or many AN:1ORDER }o--|| CUSTOMERThe CUSTOMER ||--o{ ORDER row from the other side.
}o zero or manyo| zero or oneEach A has zero or one B; each B has zero or many AN:1PRODUCT }o--o| CATEGORYThe CATEGORY |o--o{ PRODUCT row from the other side.
}o zero or many|{ one or manyEach A has one or many B; each B has zero or many AM:NARTICLE }o--|{ TAGThe TAG }|--o{ ARTICLE row from the other side.
}o zero or manyo{ zero or manyEach A has zero or many B; each B has zero or many AM:NSTUDENT }o--o{ CLUBFully optional many-to-many — a student may join no clubs, a club may have no members.

In Mermaid, -- draws a solid line (identifying relationship: the child's primary key includes the parent's key) and .. draws a dashed line (non-identifying). CUSTOMER ||..o{ ORDER : places is the same cardinality as ||--o{ with a dashed line. Labels with spaces need quotes: STUDENT }o--o{ SECTION : "enrolls in". Syntax from the Mermaid entity-relationship diagram documentation.

The marks as a 4 × 4 grid

A end ↓ / B end →|| oneo| zero or one|{ one or manyo{ zero or many
|| exactly one||--||
1:1
||--o|
1:1
||--|{
1:N
||--o{
1:N
|o zero or one|o--||
1:1
|o--o|
1:1
|o--|{
1:N
|o--o{
1:N
}| one or many}|--||
N:1
}|--o|
N:1
}|--|{
M:N
}|--o{
M:N
}o zero or many}o--||
N:1
}o--o|
N:1
}o--|{
M:N
}o--o{
M:N

How do you read crow's foot notation?

Pick one entity, imagine one row of it, then look at the marks at the far end of the line: they tell you how many rows of the far entity that one row can have. Then do the same from the other side. Inner mark = minimum, outer mark = maximum.

RuleApplied to CUSTOMER ||——o{ ORDER
1. Read from an entity toward the other oneStart at CUSTOMER, look at the marks next to ORDER: o{.
2. The mark nearest the far entity is the maximumThe crow's foot touches ORDER: one customer can have many orders.
3. The mark behind it is the minimumThe circle: a customer can have zero orders. So: zero or many.
4. Turn around and read the other endStart at ORDER, look next to CUSTOMER: || — exactly one customer per order, mandatory.
5. Put both sentences together“A customer places zero or many orders; an order is placed by exactly one customer.” That is a one-to-many relationship, optional on the many side.
6. The foreign key lives on the many sideORDER gets a NOT NULL customer_id column. A circle on the one side instead (|o) would make it nullable.

The verb label on the line is read in the same direction as rule 1; if the two readings need different verbs (places / is placed by) most tools show only the forward one. A relationship with crow's feet on both ends (many-to-many) has no foreign-key home and is resolved into a junction table — see the ER diagram symbols hub.

What does a worked crow's foot example look like?

Five entities, four relationships, all four marks. Read every line end with the rules above: CUSTOMER places zero or many ORDERs; an ORDER contains one or many ORDER_LINEs; a PRODUCT appears in zero or many ORDER_LINEs; a CUSTOMER has zero or one default ADDRESS.

Orders ER diagram in crow's foot notation: CUSTOMER places zero or many ORDERs, ORDER contains one or many ORDER_LINEs, PRODUCT appears in zero or many ORDER_LINEs, CUSTOMER has zero or one default ADDRESSplacescontainsappears inhas defaultCUSTOMERPKcustomer_idnameemailORDERPKorder_idFKcustomer_idorder_datestatusORDER_LINEPK,FKorder_idPK,FKproduct_idquantityPRODUCTPKproduct_idnameunit_priceADDRESSPKaddress_idFKcustomer_idstreetcityCrow's foot (IE) notation · inner mark = minimum, outer mark = maximum
Orders data model in crow's foot (IE) notation with attribute lists. ORDER_LINE's primary key is composite (order_id, product_id), so both of its relationships are identifying. Every other foreign key is non-identifying.
LineA endB endSentence
CUSTOMER — ORDER|| exactly oneo{ zero or manyA customer places zero or many orders; an order belongs to exactly one customer.
ORDER — ORDER_LINE|| exactly one|{ one or manyAn order contains at least one line; a line belongs to exactly one order.
PRODUCT — ORDER_LINE|| exactly oneo{ zero or manyA product appears in zero or many lines; a line refers to exactly one product.
CUSTOMER — ADDRESS|| exactly oneo| zero or oneA customer has zero or one default address; a default address belongs to exactly one customer.

The same model as Mermaid — paste it into any Mermaid renderer, or describe it in English to the ER diagram generator:

erDiagram
    CUSTOMER ||--o{ ORDER : places
    CUSTOMER ||--o| ADDRESS : "has default"
    ORDER ||--|{ ORDER_LINE : contains
    PRODUCT ||--o{ ORDER_LINE : "appears in"

What are the common mistakes with crow's foot notation?

Almost every wrong crow's foot diagram makes one of six errors: reading the marks from the wrong side, swapping the inner and outer marks, leaving a many-to-many unresolved, forgetting the minimum, pointing the foot at the parent, or mixing notations.

MistakeWhat it looks likeFix
Reading the marks on the near endStarting at CUSTOMER and reading the || next to CUSTOMER as “a customer has one…”The marks next to an entity describe that entity's count per one instance of the other entity. Always read the far end.
Swapping inner and outerDrawing the circle touching the entity and the bar behind itOuter (touching the entity) = maximum; inner = minimum. A circle is never the outer mark.
Leaving many-to-many in a physical modelSTUDENT }o--o{ COURSE with no table betweenFine for a conceptual sketch; for a schema insert a junction entity (ENROLMENT) with ||--o{ to each side.
Omitting the minimumA bare crow's foot with no circle or bar behind itDecide: can the parent exist with zero children? Add o or | accordingly — it becomes a NOT NULL or nullable decision later.
Foot on the parentCUSTOMER }o--|| ORDER for “a customer places orders”The foot sits on the entity that can have many rows per one of the other. Orders are many per customer, so the foot touches ORDER.
Mixing notations1 and N labels or UML 0..* next to crow's feetPick one notation per diagram. Chen labels and UML multiplicities are read differently (see Chen notation).

Frequently asked questions

What is the one-to-many symbol in an ER diagram?

In crow's foot notation, one-to-many is two bars || (exactly one) on the parent end and a crow's foot on the child end — o{ if the parent can have zero children, |{ if it must have at least one. In Mermaid: CUSTOMER ||--o{ ORDER.

What does the crow's foot symbol mean?

The three-pronged mark touching an entity means “many”: one row of the entity at the other end can relate to many rows of this one. Combined with the inner mark it reads zero-or-many (circle + foot) or one-or-many (bar + foot).

What are the four crow's foot cardinality symbols?

Exactly one ||, zero or one o|, one or many |{ and zero or many o{. Each is a (minimum, maximum) pair: the inner mark is the minimum (circle = 0, bar = 1), the outer mark touching the entity is the maximum (bar = 1, crow's foot = many).

Which side of the line does the crow's foot go on?

On the entity that can have many rows for one row of the other entity — the child or “many” side, which is also the side that holds the foreign key. For customers and orders, the foot touches ORDER.

What is the difference between zero-or-many and one-or-many?

The minimum. Zero or many o{ means the parent can exist with no children (a customer with no orders). One or many |{ means at least one child is required (an order with at least one line). The maximum, many, is the same.

How do you write crow's foot notation in Mermaid?

With erDiagram: left-end code, line, right-end code, entity names, optional label. Left ends are ||, |o, }|, }o; right ends are ||, o|, |{, o{. -- is a solid (identifying) line, .. a dashed (non-identifying) one. Example: ORDER ||--|{ ORDER_LINE : contains.

Is crow's foot the same as IE notation?

Yes — Information Engineering (IE) notation is the formal name; “crow's foot” describes its many-mark. Barker notation uses the same foot but shows optionality with a dashed line rather than a circle, and Chen notation uses 1 / N labels and diamonds instead of marks.

How do you show many-to-many in crow's foot notation?

A crow's foot on both ends, e.g. STUDENT }o--o{ COURSE. In a physical schema the relationship is replaced by a junction table (ENROLMENT) with a one-to-many line to each original entity: STUDENT ||--o{ ENROLMENT and COURSE ||--o{ ENROLMENT.

Say “a customer places many orders” — ChartCraft puts the right marks on the line.

ER diagram generator →