Cardinality and Optionality

 

Cardinality and optionality provide precise specifications for relationships, defining not just the type of relationship but whether participation is mandatory or optional—understanding these concepts is essential for designing databases that accurately enforce business rules and prevent invalid data—this topic explores how to specify and implement cardinality and optionality constraints.

 

Cardinality vs Optionality

Cardinality

Definition: The maximum number of instances that can participate in a relationship

Types:

  • One (1): Exactly one
  • Many (M or N): Zero or more (unlimited)
  • CUSTOMER PLACES ORDER

     

    Cardinality from CUSTOMER side:

    One customer can place zero , one , or many orders

    Cardinality = M ( many )

     

    Cardinality from ORDER side:

    One order belongs to exactly one customer

    Cardinality = 1 ( one )

     

    Result: One to Many ( 1 :M )

     

    Optionality

    Definition: Whether participation in a relationship is mandatory or optional

    Types:

  • Mandatory (1): Must participate; minimum 1
  • Optional (0): May or may not participate; minimum 0
  • EMPLOYEE WORKS IN DEPARTMENT

     

    Two interpretations:

     

    MANDATORY ( every employee must be in a department ) :

    Minimum: 1 employee per department

    Maximum: Many employees per department

    Notation: 1 ..M

     

    OPTIONAL ( employee might not be assigned yet ) :

    Minimum: 0 employees per department ( new dept can be empty )

    Maximum: Many employees per department

    Notation: 0 ..M

     

    Chen's Notation (Traditional ER Model)

    Notation System

    ( Min , Max ) Notation

     

    ( 1 , 1 )     = Exactly 1 ( mandatory , singular )

    ( 0 , 1 )     = 0 or 1 ( optional , at most one )

    ( 1 , M )     = 1 to many ( mandatory , multiple )

    ( 0 , M )     = 0 to many ( optional , multiple )

    Example: E-Commerce System

    CUSTOMER ( 1 , M ) PLACES ( 1 , 1 ) ORDER

     

    Customer side : ( 1 , M )

    Minimum: 1 customer per order ( every order has a customer )

    Maximum: M customers ( doesn 't apply, one order one customer)

    Read: "One customer places one or more orders"

     

    Order side: ( 1 , 1 )

    Minimum: 1 order per customer ( if customer exists in context )

    Maximum: 1 order ( each order belongs to one customer )

    Read: "One order belongs to one customer"

     

    Business meaning:

    Every customer can place many orders ( required to have customer )

    Every order belongs to exactly one customer

     

    Crow's Foot Notation (Modern)

    Symbols

    |  = 1 ( exactly one )

    <  = < is "many" symbol

    o  = optional ( 0 )

    |  = mandatory ( 1 )

     

    Combining :

    | |  = 1 :1 ( mandatory on both sides )

    o |  = 0 :1 ( optional one side , mandatory other )

    | <  = 1 :M ( one to many )

    o <  = 0 :M ( optional many )

    > <  = M:M ( many to many )

    Examples

    Mandatory One to Many:

    DEPARTMENT | ———— EMPLOYEE

    ( Every employee in exactly one department mandatory )

     

    Optional One to Many:

    MANAGER o———— EMPLOYEE

    ( Employee may or may not have manager )

     

    One to One:

    PERSON || ———— PASSPORT

    ( One person , one passport , both mandatory )

     

    Optional One to One:

    EMPLOYEE o | —— || o PROJECT_MANAGER

    ( Employee may not have assigned project )

     

    Many to Many:

    STUDENT >< ———— COURSE

    ( Students take multiple courses , courses have multiple students )

     

    Optionality: Mandatory vs Optional

    Mandatory Relationships (Minimum = 1)

    Definition: Every instance must participate

    EMPLOYEE WORKS IN DEPARTMENT

     

    Business rule : "Every employee must be assigned to a department"

     

    ER Notation :

    EMPLOYEE ( 1 , M ) WORKS IN ( 1 , 1 ) DEPARTMENT

     

    Design :

    EMPLOYEE Table :

    EmployeeID

    EmployeeName

    DepartmentID ( NOT NULL cannot be empty )

     

    Enforcement :

    FK constraint ensures DepartmentID exists

    NOT NULL constraint ensures always specified

    When to use mandatory:

  • Every instance of entity must have relationship
  • Business rule requires participation
  • No valid state without relationship
  • Examples: Employee in Department, Order by Customer
  •  

    Optional Relationships (Minimum = 0)

    Definition: Instance may or may not participate

    EMPLOYEE MANAGES EMPLOYEE

     

    Business rule : "Not every employee manages anyone"

     

    ER Notation :

    EMPLOYEE ( 0 , M ) MANAGES ( 0 , 1 ) EMPLOYEE

     

    Design :

    EMPLOYEE Table :

    EmployeeID

    EmployeeName

    ManagerID ( NULL allowed can be empty )

     

    Enforcement :

    FK constraint allows NULL

    NULL = no manager ( staff member , not manager )

    Non NULL = has manager

    When to use optional:

  • Instance may exist without relationship
  • Relationship develops over time
  • Some instances don't participate
  • Examples: Manager (not all employees manage), Address (not all people have permanent address)
  •  

    Real-World Examples

    Example 1: Bank Account System

    CUSTOMER ( 1 , M ) OPENS ( 1 , 1 ) ACCOUNT

     

    Cardinality :

    CUSTOMER side : One customer can open many accounts ( checking , savings , etc .)

    ACCOUNT side : One account belongs to exactly one customer

     

    Optionality :

    CUSTOMER ( mandatory ) : Every account must have a customer

    ACCOUNT ( mandatory ) : Every customer must have at least one account to be a customer

     

    ER Notation : ( 1 , M ) and ( 1 , 1 ) = Both mandatory

     

    Design :

    CUSTOMER Table :

    CustomerID

    Name

    Email

     

    ACCOUNT Table :

    AccountID

    CustomerID ( NOT NULL FK )

    AccountType

    Balance

     

    Business Rules :

    New customer can open first account

    Existing customer can open more accounts

    Account must have associated customer

    Account without customer not allowed

    Customer without accounts not meaningful ( but might allow for setup )

    Example 2: University Course Enrollment

    STUDENT ( 0 , M ) ENROLLS IN ( 0 , M ) COURSE

     

    Cardinality :

    STUDENT side : One student takes many courses

    COURSE side : One course has many students

     

    Optionality :

    STUDENT ( optional ) : Course can exist without enrolled students ( new course )

    COURSE ( optional ) : Student can exist without enrollments ( new student )

     

    ER Notation : ( 0 , M ) and ( 0 , M ) = Both optional

     

    Design :

    STUDENT Table :

    StudentID

    Name

    Email

     

    COURSE Table :

    CourseID

    CourseName

    Instructor

     

    ENROLLMENT Table ( Junction ) :

    StudentID ( FK )

    CourseID ( FK )

    EnrollmentDate

    Grade

     

    Business Rules :

    New student with no enrollments

    New course with no enrollments

    Student enrolls in multiple courses

    Course has multiple students

    Enrollment records link them

    Example 3: Employee-Department-Project

    EMPLOYEE ( 1 , M ) WORKS FOR ( 1 , 1 ) DEPARTMENT

    EMPLOYEE ( 0 , M ) WORKS ON ( 0 , M ) PROJECT

     

    Works For:

    Mandatory: Every employee must work in exactly one department

    Min = 1 , Max = M for employee side

    Min= 1 , Max = 1 for department side

     

    Works On:

    Optional: Employees may not be assigned to projects

    Min= 0 , Max =M for employee side

    Min= 0 , Max =M for project side

     

    Design :

    EMPLOYEE :

    EmployeeID

    Name

    DepartmentID ( NOT NULL )

     

    DEPARTMENT :

    DepartmentID

    DepartmentName

     

    PROJECT :

    ProjectID

    ProjectName

     

    EMPLOYEE_PROJECT ( Junction ) :

    EmployeeID ( FK )

    ProjectID ( FK )

    HoursAllocated

     

    Implementing Cardinality and Optionality

    One-to-One (1:1)

    Mandatory Both Sides: (1,1) to (1,1)

    PERSON || ———— PASSPORT

     

    Design :

    PERSON :

    PersonID ( PK )

    Name

    PassportID ( FK , UNIQUE , NOT NULL )

     

    PASSPORT :

    PassportID ( PK )

    Number

    IssueDate

     

    Constraint : PassportID must be unique in PERSON

    Optional One Side: (0,1) to (1,1)

    EMPLOYEE o | —— || PARKING_SPOT

     

    Design :

    EMPLOYEE :

    EmployeeID ( PK )

    Name

    ParkingSpotID ( FK , UNIQUE , NULL allowed )

     

    PARKING_SPOT :

    SpotID ( PK )

    Location

    SpotNumber

     

    Constraint : ParkingSpotID can be NULL ( not all have spots )

    One-to-Many (1:M)

    Mandatory Child: ( 1,M ) to (1,1)

    DEPARTMENT | ———— EMPLOYEE

     

    Design :

    DEPARTMENT :

    DepartmentID ( PK )

    DepartmentName

     

    EMPLOYEE :

    EmployeeID ( PK )

    Name

    DepartmentID ( FK , NOT NULL )

     

    Constraint : Every employee must have department

    Optional Child: ( 1,M ) to (0,1)

    MANAGER o———— EMPLOYEE

     

    Design :

    EMPLOYEE :

    EmployeeID ( PK )

    Name

    ManagerID ( FK , NULL allowed )

     

    Constraint : ManagerID can be NULL ( some don 't have manager)

    Many-to-Many (M:M)

    Mandatory Junction: ( 1,M ) to ( 1,M )

    EMPLOYEE >< ———— PROJECT

     

    Design :

    EMPLOYEE :

    EmployeeID ( PK )

    Name

     

    PROJECT :

    ProjectID ( PK )

    ProjectName

     

    ASSIGNMENT ( Junction ) :

    EmployeeID ( FK , PK )

    ProjectID ( FK , PK )

    HoursAllocated

     

    Constraint : Records created only when employee assigned to project

     

    Common Mistakes

    Mistake 1: Wrong Optionality

    WRONG :

    CUSTOMER — CustomerID ( optional FK )

    Should require : Every order must have customer

     

    CORRECT :

    CUSTOMER — CustomerID ( NOT NULL FK )

    Every order has a customer

    Mistake 2: Confusing Cardinality and Optionality

    CONFUSION :

    "One-to-Many means optional"

     

    CLARITY :

    One to Many = cardinality ( max relationship count )

    Mandatory / Optional = optionality ( min relationship count )

     

    Can have mandatory one to many or optional one to many

    Mistake 3: Not Enforcing in Database

    NO ENFORCEMENT :

    Create FK but allow NULL ( optional ) when should be mandatory

     

    PROPER ENFORCEMENT :

    Use NOT NULL constraints

    Use FK constraints

    Add CHECK constraints for complex rules

     

    Decision Matrix

    When designing relationships, ask:

    Question

    Answer

    Optionality

    Must instance participate?

    Yes

    Mandatory (1)

    Can instance exist alone?

    No

    Mandatory (1)

    Is relationship required?

    Yes

    Mandatory (1)

    Can instance exist alone?

    Yes

    Optional (0)

    Is relationship optional?

    Yes

    Optional (0)

    Some instances don't need?

    Yes

    Optional (0)

     

    💡 Key Insights

    •   Cardinality: How many (1 or many)

    •   Optionality: Whether required (mandatory) or not (optional)

    •   Minimum/Maximum: Min 0/1, Max 1/M

    •   Enforce in database: Use constraints

    •   Mandatory = NOT NULL: In relational design

    •   Optional = NULL allowed: In relational design

    📚 Study Notes

    •   Cardinality: 1 (one) or M (many)

    •   Optionality: 0 (optional) or 1 (mandatory)

    •   Chen notation: (Min, Max) format

    •   Crow's foot: Visual symbols

    •   Mandatory: Must participate ( min =1)

    •   Optional: May not participate ( min =0)

      ( 1,1): Exactly one, mandatory

      ( 0,1): Zero or one, optional

      (1,M ): One or many, mandatory

      (0,M ): Zero or many, optional

    •   FK NOT NULL: Mandatory relationship

    •   FK NULL allowed: Optional relationship

    Leave a Reply