Entity-relationship model (ER model)
      
      
  - models data as entities and relationships
 
- closer to real world than other models ???
 
- mainly used for database schemas
 
Definitions
- entity: individual thing that exists, e.g. concrete person, physical address, JavaScript object, etc.
 
- attribute: individual property of an entity, characterises the entity, e.g. concrete age of concrete person
 
- relationship: individual relation of multiple entities, e.g. concrete person has concrete birthday
 
- entity type: abtract notion of the type of an entity, e.g. a person, an address, a JSON schema, etc.
 
- attribute type: abtract notion of the type of an attribute, characterises the entity type, e.g. the age of a person
 
- relationship type: abstract notion of the type of a relationship, e.g. a person has a birthday
 
- beware: often entity, attribute, relationship are used as synonym for their types ❗️
 
- an entity is an instance of its entity type, e.g. an object is an instance of its object type
 
- similarly an attribute is an instance of its attribute type, a relationship is an instance of its relationship type
 

ER diagram
- diagram of entity types with their attribute types and their relationship types, usually drawn as boxes and lines
 
- beware: the diagram is drawn for the abstract types, it really “exists” only for the concrete instances ❗️
 

- can think of entity types as nouns and relationship types as verbs, e.g. person owns car, car is owned by person
 
- beware: a relationship label can be read in one direction only, the other direction is obtained by turning the verb into passive voice
 
- beware: label a relationship with a verb in active voice instead of passive, otherwise can’t express the reverse relationship type ❗️
 
- entity types and relationship types have each a label, e.g. “Person” “has” “Birthday”
 
- entity types and relationship types can both have attribute types, relationship is first-class citizen, e.g. relationship type 
created with attribute type when: Date 
- attribute types can be drawn in separate boxes connected to entity type, here we draw them directly on the entity type like object properties
 
Cardinality of a relationship type
- number of instances of the second entity type that one instance of the first entity type can have the given relationship with, e.g. a person (instance) can own multiple books (instance)
 
- cardinality can be determined for each entity in a relationship, may very well have different cardinalities, e.g. a person (instance) has one birthday (instance), one birthday (instance) can be had by multiple people (instances)
 
- cardinality is notated at the end of the line close to the other entity
 
- usually uses Martin-notation: a ring represents 
0, a vertical dash represents 1, a crow’s foot represents more, can be expressed in letters as o, |, { / } (depending on direction) 
- always combines two symbols, the inner component represents the minimum, the outer component represents the maximum, from the point of view of the given entity
 
- makes only sense for the following combinations: the symbol 
|| means exactly one, o{ means zero or more, and |{ means one or more, for cardinality from left entity to right 


- beware: if wants to be able to version the data, needs to keep the cardinality of a relationship at one and have many duplicated entities with the same content, instead of having a single entity that many otherwise unrelated entities link to, e.g. 
Person ||has|| Birthday, Person ||has|| Age, Person ||has|| Address, Person ||has|| Nationality, instead of }|has|| or Person ||has|{ Book instead of }|has|{ etc. ⚠️ 


Database schema
- structure of data
 
- often modeled using ER model, i.e. fixed structure of entity types, relationship types, attribute types
 
- implemented using constraints
 
- used to give data a predictable structure
 
- not every database needs to have a schema although often useful, e.g. graph databases
 
- beware: using an ER model doesn’t imply database needs to have schema ❗️
 
Resources