diff --git a/docs/DB.md b/docs/DB.md new file mode 100644 index 0000000..ce5bce5 --- /dev/null +++ b/docs/DB.md @@ -0,0 +1,75 @@ +# About the database schema + +## Collections + +### trainers collection + +* _id: ObjectId +* name: string + * (_indexed_: would be queried often in a dashboard situation) +* dob: date +* wins: int +* losses: int +* past_opponents: array of ObjectId (references to other trainers) + * (_indexed_: reflexivity would make deep queries quite slow, so it seems worthwhile) +* pokemongs: array of ObjectId (references to owned pokemongs) + denormalizing on "nickname" and "species" + * (_indexed_: to improve speed when querying non-denormalized fields) + +### pokemongs collection + +* _id: ObjectId +* nickname: string +* dob: date +* level: int +* pokedex_id: int +* evo_stage: int + * (_indexed_: "species" is calculated as evo_track[evo_stage], and would be queried often) +* evo_track: array of strings (therefore "species" is evo_track[evo_stage], and "evo_base" is evo_track[0]) + * (_indexed_: "species" is calculated as evo_track[evo_stage], and xould be queried often) +* is_mega_evolved: boolean + * **polymorphic**: this field is only here for mature_pokemongs, i.e. pokemongs who have reached their last evo_stage +* trainer: ObjectId? (reference to a trainer) (but can be "wild" instead, if ref is null) + * (_indexed_: could be queried often in a dashboard situation) +* types: embedded type, or array of embedded types + * (_indexed_: would be queried often in a dashboard situation) +* move_set: array of ObjectId (references to known moves) + denormalizing on "name" + +### moves collection + +* _id: ObjectId +* name: string + * (_indexed_: would be queried often in a dashboard situation) +* category: string (can be "physical", "special", or "status") +* pp: int +* power: int + * (_indexed_: would be used often in sorts, in a dashboard situation) +* accuracy: int +* type: embedded type + * (_indexed_: would be queried often in a dashboard situation) + + +### types collection + +* _id: ObjectId +* name: string + * (_indexed_: would be queried often in a dashboard situation) +* weak_against: array of strings (denormalized type names) +* effective_against: array of strings (denormalized type names) + +## Relationships + +* trainers.past_opponents: one-to-many and reflexive + * => referencing +* trainers.pokemongs: one-to-many + * => referencing + denormalizing on "nickname" and "species" +* pokemongs.trainer: many-to-one + * => referencing +* pokemongs.types: one-to-few [1;2] but will also need to be queried independently + * => denormalizing on all fields +* pokemongs.move_set: one-to-few [1;4] but will also need to be queried independently + * => referencing + denormalizing on "name" +* moves.type: one-to-one [1;1] but will also need to be queried independently + * => denormalizing on all fields +* types.weak_against & types.effective_against: one-to-few but reflexive + * => denormalizing on "name" + \ No newline at end of file diff --git a/docs/mcd.png b/docs/mcd.png new file mode 100644 index 0000000..a8ef40a Binary files /dev/null and b/docs/mcd.png differ diff --git a/docs/nosql_uml.png b/docs/nosql_uml.png new file mode 100644 index 0000000..0979200 Binary files /dev/null and b/docs/nosql_uml.png differ