Data Mapper Krug 8

1,214 views

Published on

Piotr's presentation on Datamapper and Merb at the Krakow Ruby User Group

Published in: Technology, Education
  • Be the first to like this

Data Mapper Krug 8

  1. 1. BY PIOTR SOLNICA
  2. 2. Plan Prezentacji <ul><li>Istniejące Implementacje ORM </li></ul><ul><li>Architektura </li></ul><ul><ul><li>Repozytoria </li></ul></ul><ul><ul><li>Adaptery </li></ul></ul><ul><ul><li>Zasoby </li></ul></ul><ul><li>Podstawy </li></ul><ul><li>Key Features </li></ul><ul><li>Status projektu </li></ul>November 19, 2008 © Piotr Solnica
  3. 3. DataMapper Istniejące Implementacje ORM November 19, 2008 © Piotr Solnica
  4. 4. Istniejące Implementacje ORM ActiveRecord & Sequel November 19, 2008 © Piotr Solnica
  5. 5. Istniejące Implementacje ORM Po co trzeci zawodnik…? November 19, 2008 © Piotr Solnica
  6. 6. Istniejące Implementacje ORM <ul><li>ActiveRecord: </li></ul><ul><ul><li>Kiepska architektura – obsługuje tylko relacyjne bazy danych i do tego nie wie czym jest klucz złożony… </li></ul></ul><ul><ul><li>Dużo wtyczek, przy czym każdy update powoduje, że połowa przestaje działać </li></ul></ul><ul><ul><li>Szybki kosztem pamięci </li></ul></ul><ul><ul><li>Frustrujące API! </li></ul></ul>November 19, 2008 © Piotr Solnica
  7. 7. Istniejące Implementacje ORM <ul><li>Sequel: </li></ul><ul><ul><li>Trochę lepszy ActiveRecord </li></ul></ul>November 19, 2008 © Piotr Solnica
  8. 8. Istniejące implementacje ORM November 19, 2008 © Piotr Solnica
  9. 9. Istniejące Implementacje ORM Poza tym wszystkim… November 19, 2008 © Piotr Solnica
  10. 10. Istniejące Implementacje ORM … ActiveRecord & Sequel używają… November 19, 2008 © Piotr Solnica
  11. 11. Istniejące Implementacje ORM MIGRACJI! November 19, 2008 © Piotr Solnica
  12. 12. Istniejące Implementacje ORM DataMapper November 19, 2008 © Piotr Solnica
  13. 13. DataMapper Architektura November 19, 2008 © Piotr Solnica
  14. 14. DataMapper / Architektura Repozytoria MySQL CauchDB SimpleDB Adaptery Zasoby November 19, 2008 © Piotr Solnica
  15. 15. DataMapper / Architektura Repozytoria November 19, 2008 © Piotr Solnica
  16. 16. DataMapper / Architektura / Repozytoria <ul><li>Repozytoria są to źródła danych, na przykład: </li></ul><ul><ul><li>relacyjne bazy danych (doooh!) </li></ul></ul><ul><ul><li>obiektowe bazy danych </li></ul></ul><ul><ul><li>systemy plików </li></ul></ul><ul><ul><li>YAML, JSON, XML itd. </li></ul></ul><ul><ul><li>Amazon SimpleDB </li></ul></ul><ul><ul><li>REST-based </li></ul></ul>November 19, 2008 © Piotr Solnica
  17. 17. DataMapper / Architektura / Repozytoria Każdy system udostępniający dane za pomocą swojego interfejsu może stać się repozytorium DataMappera November 19, 2008 © Piotr Solnica
  18. 18. DataMapper / Architektura Adaptery November 19, 2008 © Piotr Solnica
  19. 19. DataMapper / Architektura / Adaptery Adaptery zapewniają transparentny dostęp do danych z repozytoriów November 19, 2008 © Piotr Solnica
  20. 20. DataMapper / Architektura / Adaptery <ul><li>Istniejące adaptery: </li></ul><ul><ul><li>MySQL / Postgres / SQLite </li></ul></ul><ul><ul><li>YAML </li></ul></ul><ul><ul><li>CSV </li></ul></ul><ul><ul><li>CouchDB </li></ul></ul><ul><ul><li>Amazon SimpleDB </li></ul></ul><ul><ul><li>Ferret </li></ul></ul><ul><ul><li>IMAP </li></ul></ul><ul><ul><li>… masa innych under development  </li></ul></ul>November 19, 2008 © Piotr Solnica
  21. 21. DataMapper / Architetura Zasoby November 19, 2008 © Piotr Solnica
  22. 22. DataMapper / Architektura / Zasoby Zasoby reprezentują dane z repozytoriów, za ich pośrednictwem wykonujemy operacje CRUD November 19, 2008 © Piotr Solnica
  23. 23. DataMapper / Architektura / Zasoby Każdy zasób charakteryzuje się różnymi własnościami, przy czym własności te mogą być związane z różnymi repozytoriami… November 19, 2008 © Piotr Solnica
  24. 24. DataMapper / Architektura / Zasoby … to my decydujemy jakie własności zasobów nas interesują, a nie zautomatyzowany do bólu ORM! November 19, 2008 © Piotr Solnica
  25. 25. DataMapper / Architektura / Zasoby Pomiędzy zasobami mogą istnieć powiązania typowe dla relacyjnych baz danych (one-to-one, one-to-many etc.) November 19, 2008 © Piotr Solnica
  26. 26. DataMapper Podstawy November 19, 2008 © Piotr Solnica
  27. 27. DataMapper / Podstawy dm-core & dm-more November 19, 2008 © Piotr Solnica
  28. 28. DataMapper / Podstawy <ul><li>Trzy poziomy API: </li></ul><ul><ul><li>public </li></ul></ul><ul><ul><li>semi-public </li></ul></ul><ul><ul><li>private </li></ul></ul>November 19, 2008 © Piotr Solnica
  29. 29. DataMapper / Podstawy Własności modelu deklaruje się na poziomie jego klasy! class Zoo include DataMapper::Resource property :id, Serial property :name, String end November 19, 2008 © Piotr Solnica
  30. 30. DataMapper / Podstawy Relacje class Zoo include DataMapper::Resource property :id, Serial property :name, String has n, :animals has 1..10 , :young_animals, :class_name => ‘Animal’, :age => 1..3 end class Animal include DataMapper::Resource property :id, Serial property :name, String property :age, Integer belongs_to :zoo end November 19, 2008 © Piotr Solnica
  31. 31. DataMapper / Podstawy Automigracje Zoo.auto_migrate! Zoo.auto_upgrade! November 19, 2008 © Piotr Solnica
  32. 32. DataMapper / Podstawy Tworzenie nowych zasobów some_zoo = Zoo.create(:name => ‘Some Zoo’) some_zoo.animals.create(:name => ‘Marty’) another_zoo = Zoo.new(:name => ‘Another Zoo’) another_animal = Animal.new( :name => ‘Alex’, :zoo => another_zoo) another_zoo.save another_animal.save November 19, 2008 © Piotr Solnica
  33. 33. DataMapper / Podstawy Pobieranie zasobów zoo = Zoo.get(1) zoo.animals.get(1) zoo = Zoo.first(:name => ‘Some Zoo’) zoo.animals.all(:name => ‘Marty’) November 19, 2008 © Piotr Solnica
  34. 34. DataMapper / Podstawy Callbacks class Zoo include DataMapper::Resource property :id, Serial property :name, String before :save do name = ‘Default Name’ if name.blank? end end November 19, 2008 © Piotr Solnica
  35. 35. DataMapper Key Features November 19, 2008 © Piotr Solnica
  36. 36. DataMapper / Key Features IdentityMap repository do marty1 = Zoo.get( 1 ) marty2 = Zoo.get( 1 ) marty1.object_id == marty2.object_id # true end November 19, 2008 © Piotr Solnica
  37. 37. DataMapper / Key Features Animal.create(:name => ‘Marty’, :age => 12 ) marty = Animal.first(:name => 'Marty' ) marty.attribute_dirty?(:age) # false marty.age = 21 marty.attribute_dirty?(:age) # false marty.save # UPDATE `animals` SET `age` = 21 WHERE (`id` = 1) Dirty Properties Tracking November 19, 2008 © Piotr Solnica
  38. 38. DataMapper / Key Features class Zoo include DataMapper::Resource property :id, Serial property :description, Text end Zoo.create(:description => ‘This is a very nice zoo’) # SELECT `id` FROM `zoos` WHERE (`id` = 1) ORDER BY `id` LIMIT 1 zoo = Zoo.get(zoo1.id) # SELECT `description`, `id` FROM `zoos` WHERE (`id` = 1) ORDER BY `id` zoo.description Lazy Loading November 19, 2008 © Piotr Solnica
  39. 39. DataMapper / Key Features zoos = Zoo.all # nie wykonuje się żadne zapytanie! zoos.each do |zoo| # dopiero tutaj zostaną pobrane wszystkie zoo zoo.animals.each do |animal| # a tutaj wszystkie animals należące do zoos! puts &quot;Animal #{animal.name} from #{zoo.name}&quot; end end Strategic Eager Loading November 19, 2008 © Piotr Solnica
  40. 40. DataMapper / Key Features class Zoo include DataMapper::Resource property :id, Serial end class Cage include DataMapper::Resource property :id, Serial end class Animal include DataMapper::Resource property :zoo_id, :key => true property :cage_id, :key => true end Composite Keys November 19, 2008 © Piotr Solnica
  41. 41. DataMapper / Key Features zoo = Zoo.create cage = Cage.create(:zoo => zoo) Animal.create(:zoo => zoo, :cage => cage) animal = Animal.get(zoo.id, cage.id) Composite Keys November 19, 2008 © Piotr Solnica
  42. 42. DataMapper / Key Features class Zoo include DataMapper::Resource property :id, Serial property :name, String, :length => 12..64 end zoo = Zoo.new(:name => ‘Too short’) # [&quot;Name must be between 12 and 64 characters long&quot;] zoo.errors[:name] Auto-Validations November 19, 2008 © Piotr Solnica
  43. 43. DataMapper / Key Features class Article include DataMapper::Resource property :id, Serial property :title, String property :body, Text validates_present :title, : when => [:publish] validates_length :body, :minimum => 1000 , : when => [:publish] end article = Article.new article.valid_for_publish? # false article.title = 'Hello World' article.valid_for_publish? # false article.body = '...some 1000 chars text...' article.valid_for_publish? # true! Contextual Validations November 19, 2008 © Piotr Solnica
  44. 44. DataMapper / Key Features class User include DataMapper::Resource property :id, Serial property :postal_code, PostalCode end user = User.new(:postal_code => '12-34' ) user.valid? # false user.errors[:postal_code] # [&quot;Postal code has an invalid format&quot;] user.postal_code = '12-345' user.valid? # true Custom Data Types November 19, 2008 © Piotr Solnica
  45. 45. DataMapper / Key Features module DataMapper module Types class PostalCode < DataMapper::Type primitive String format(/^d{ 2 }-d{ 3 }$/) end end end Custom Data Types November 19, 2008 © Piotr Solnica
  46. 46. DataMapper Status Projektu November 19, 2008 © Piotr Solnica
  47. 47. DataMapper / Status Projektu CURRENT VERSION: 0.9.6 November 19, 2008 © Piotr Solnica
  48. 48. DataMapper Pytania? November 19, 2008 © Piotr Solnica
  49. 49. DataMapper Dziękuję November 19, 2008 © Piotr Solnica

×