数据库实体对象模型 - 松散与严格表示?

时间:2014-08-01 23:59:34

标签: php database api oop

我正在努力决定这个困境,因为我正在编写一些正在研究的PHP API。我正在努力编写一些可靠的API,而不是PHP的老手,通过黑暗的希望找到一些最佳实践。我也不确定我是否使用了正确的术语,所以请纠正我。

我有一些实体将他们的数据存储在数据库中,我正在以面向对象的方式进行建模。我的模型是否应始终严格代表数据库中当前的内容?



松散的数据库表示

  • 用户可以自由更改模型的属性,然后保存对数据库的任何更改。
  • 模型并不总是反映数据库中的内容,因为用户可以任意更改模型。

<?php

  // Write a snippet
$snippet = (new Snippet)
    ->label("grapes")
    ->content("wine")
    ->save();

  // Load a snippet
$snippet = (new Snippet)
    ->label("bananas")
    ->load();

  // Update an existing snippet
$snippet
    ->content("potassium")
    ->save();

?>




严格的数据库表示

  • 用户无法自由更改模型的属性。只为属性提供了getter(没有setter)。
  • 保证模型始终代表数据库中的内容。
  • 更改模型的唯一方法是更改​​数据库中的内容。

<?php

  // Write a snippet
$snippet = (new Snippet)->write("grapes", "wine");

  // Load a snippet
$snippet = (new Snippet)->read("bananas");

  // Update an existing snippet
$snippet->update("potassium");

?>

您更喜欢使用哪种API样式?

我从松散的模型开始,并开始怀疑严格的模型是否是更好的做事方式? 严格模型的完整性承诺是否超过松散模型的灵活性?

我对任何想法,评论,优点/缺点,替代方案和想法持开放态度;我只是想做正确的PHP,并制作一个其他程序员觉得讨人喜欢的好API:)

1 个答案:

答案 0 :(得分:1)

这两个例子都让我想起了ActiveRecord模式。 ActiveRecord是指您使用CRUD方法赋予对象时 - 也就是说,他们知道如何从数据源创建,读取,更新和删除自己。

现在,如果我正确理解你,你想知道是否能够设置模型的属性,然后然后调用CRUD方法,或者调用直接使用CRUD方法,传入在内部设置属性的参数?在任何一种情况下,它似乎都是“表示”和“#39;与另一方一样宽松或严格。就一个好的API来说,我会说'松散'&#39;代表性将是大多数人所期望的。

现在,提出建议。有两种流行的模式可以与数据源进行交互。一个是ActiveRecord模式,另一个是存储库模式。我简要描述了ActiveRecord模式。存储库模式从模型中删除数据交互职责,并将其放入“存储库”中。类。此存储库类负责CRUD操作。关于ActiveRecord诉存储库模式的优缺点有很多帖子,所以你可以看一下。我会说,存储库模式被更广泛地接受为“更好”的模式。一。

参考你说的时候,&#34;用户可以自由地改变模型的属性,然后保存对数据库的任何改变。&#34;一般来说,对象应该保护它们的不变量。也就是说,您不应该允许将其数据设置为无效状态。一个对象应该构造以及它需要的信息,并且除非有意义改变对象中的值,否则不提供setter。即便如此,你通常可以给setter一个更好的名字,然后就是setX()。 ei:fillUp()而不是car对象上的setFuel()。

我个人会用存储库模式设计东西:

class SnippetRepository
  void save(Snippet snippet) { ... }
  void update(Snippet snippet) { ... }
  boolean delete(Snippet snippet) { ... }
  Snippet load(SnippetId id) { ... }
end

$snippet = (new Snippet)
    ->label("grapes")
    ->content("wine");
snippetRepository.save($snippet);

我希望有所帮助。