Slide 1

Slide 1 text

Firebase Realtime Database Design nori Nov 2017 @1amageek Hello. #firebase.yebisu How are you

Slide 2

Slide 2 text

System Device Technology LSI design engineer iOS engineer iOS engineer 2017.5 2015.10 2009.4 Bio About 1amageek

Slide 3

Slide 3 text

Salada Firebase Model Framework Pring Firestore Model Framework Bleu Bluetooth Library https://qiita.com/1amageek OSS Library

Slide 4

Slide 4 text

Why design is necessary?

Slide 5

Slide 5 text

Because, We want to 1. Simple 2. Safe 3. Efficient 4. Functional

Slide 6

Slide 6 text

What is design in IT?

Slide 7

Slide 7 text

Organize data Connect data and data together

Slide 8

Slide 8 text

What is design for engineers?

Slide 9

Slide 9 text

Easy to connect Making data and data easier to connect

Slide 10

Slide 10 text

Why use Firebase? https://qiita.com/1amageek

Slide 11

Slide 11 text

Design for Firebase Model Relationship Rule

Slide 12

Slide 12 text

Model 1. Typesafe 2. Common understanding

Slide 13

Slide 13 text

model id_0 property_0: “model” id_1 property_1: 0 property_0: “model” property_1: 0 class Model { let id: String let property_0: String let property_1: Int } let model0: Model = Model() model.property_0 = "model" model.property_1 = 0 let model1: Model = Model() model.property_0 = "model" model.property_1 = 0

Slide 14

Slide 14 text

Key points of model design ID let model: Model = Model() let model: Model = Model(id: “ID”)

Slide 15

Slide 15 text

/// Initialize Object public override init() { self.createdAt = Date() self.updatedAt = Date() self._ref = type(of: self).databaseRef.childByAutoId() self.id = self._ref.key super.init() } /// Initialize Object from snapshot. convenience required public init?(snapshot: DataSnapshot) { self.init() _setSnapshot(snapshot) } /// Initialize the object with the specified ID. convenience required public init?(id: String) { self.init() self.id = id self._ref = type(of: self).databaseRef.child(id) }

Slide 16

Slide 16 text

Relationship 1. Essential

Slide 17

Slide 17 text

1 : 1 1 : N N : N

Slide 18

Slide 18 text

1 : 1 1 : N N : N Just think about N : N

Slide 19

Slide 19 text

1 : 1

Slide 20

Slide 20 text

class Company { let id: String let name: String let CEO: String } class People { let id: String let name: String let company: String } let tesla: Company = Company() tesla.name = "Tesla" let mask: People = People() mask.name = "Elon Musk" tesla.CEO = mask.id mask.company = tesla.id

Slide 21

Slide 21 text

1 : N

Slide 22

Slide 22 text

class Company { let id: String let name: String let CEO: String } class People { let id: String let name: String let companies: [String] } let tesla: Company = Company() tesla.name = "Tesla" let mask: People = People() mask.name = "Elon Musk" tesla.CEO = mask.id mask.companies.append(tesla.id)

Slide 23

Slide 23 text

class Company { let id: String let name: String let CEO: String } class People { let id: String let name: String let companies: [String] } let tesla: Company = Company() tesla.name = "Tesla" let mask: People = People() mask.name = "Elon Musk" tesla.CEO = mask.id mask.companies.append(tesla.id) Growth Property

Slide 24

Slide 24 text

people id_0 name: “Elon Musk” companies id_1 id_2 ɾ ɾ id_ 0 becomes heavier

Slide 25

Slide 25 text

people-company people_id company_id_0: true company_id_1: true Separate into separate nodes company company_id_0 people people_id

Slide 26

Slide 26 text

N : N

Slide 27

Slide 27 text

people-company people_id company_id_0: true company_id_1: true company company_id_0 people people_id

Slide 28

Slide 28 text

Key points of relationship design N : N let userA: User = User() let userB: User = User() userA.follow(userB) userB.frined(userA)

Slide 29

Slide 29 text

Security 1. Essential

Slide 30

Slide 30 text

Use Firebase bolt

Slide 31

Slide 31 text

/** User */ path /user { read() { isSignedIn() } index() { [ “name" ] } path /{id} is User { read() { isSignedIn() } write() { isUser(id) } path /property { read() { isSignedIn() } } } } type User { name: String } isSignedIn() { auth != null } isUser(uid) { isSignedIn() && auth.uid == uid }

Slide 32

Slide 32 text

/** User */ path /user { read() { isSignedIn() } index() { [ “name" ] } path /{id} is User { read() { isSignedIn() } write() { isUser(id) } path /property { read() { isSignedIn() } } } } type User { name: String } isSignedIn() { auth != null } isUser(uid) { isSignedIn() && auth.uid == uid } Type Permissions

Slide 33

Slide 33 text

Key points of security design Multiple permission management isSignedIn() { auth != null } isUser(uid) { isSignedIn() && auth.uid == uid } canRead() { data.val() == null || data.child('userID').val() === auth.uid } canWrite() { data.child('userID').val() == auth.uid || newData.child('userID').val() == auth.uid } createOnly(value) { prior(value) == null && value != null }

Slide 34

Slide 34 text

Model is important for engineers

Slide 35

Slide 35 text

Salada Firebase Model Framework Let's use Salada

Slide 36

Slide 36 text

Sample code https://github.com/1amageek/SaladaSample

Slide 37

Slide 37 text

Thank you %