aboutsummaryrefslogtreecommitdiffstats
path: root/docs/constraint-classification.puml
blob: 09094f1df17e8538b655f4dbc825945cbeff046a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@startuml constraint-classification
!theme plain
title Constraint Classification (McGoveran Framework)

package "Database Constraints" {
  class RelationConstraints {
    Which relations must/can exist
    Example: referential integrity
  }

  class CardinalityConstraints {
    Relation size limits
    Examples:
    - exactly N tuples
    - at most M tuples
  }
}

package "Relation Constraints" {
  package "Tuple Constraints" {
    class AttributeConstraints {
      Domain constraints per attribute
      Examples:
      - age >= 18
      - salary > 0
      - name ≠ ""
    }

    class TupleLevelConstraints {
      Cross-attribute rules
      Example:
      if salary > 200k then age >= 30
    }
  }

  package "Relation-Level Constraints" {
    class KeyConstraints {
      Uniqueness + not null
      - Primary keys
      - Candidate keys
      - Composite keys
    }

    class FunctionalDependencies {
      A → B
      Example: ZIP → {city, state}
    }

    class ForeignKeys {
      Inclusion dependencies
      Example: employee.dept_id ⊆ department.id
    }
  }
}

package "Transition Constraints" {
  class StateTransitionRules {
    Before → After constraints
    Examples:
    - salary (monotonic increasing)
    - created_at (immutable)
  }

  class TemporalConstraints {
    Time-based rules
    Example: end_date >= start_date
  }
}

package "Multi-Relation Constraints" {
  class AggregateConstraints {
    Cross-relation aggregates
    Example: sum(dept_salaries) <= dept_budget
  }

  class MutualExclusion {
    Disjoint sets
    Example: managers ∩ ICs = ∅
  }
}

@enduml