【问题标题】:Normalization vs DeNormalization when using a JSON client with a JAVA/RDBMS stack使用带有 JAVA/RDBMS 堆栈的 JSON 客户端时的规范化与反规范化
【发布时间】:2013-09-27 05:38:51
【问题描述】:

我有一个与 JAVA/MySQL 堆栈接口的 Angular JS JSON 客户端。 由于 MySQL 是一个 RDBMS,所以我的所有数据都是标准化的(当然是前三种形式)。

我的问题可以用下面的例子来说明。

我有一个 Example 对象和一个服务器返回的 User 对象。

Example - [{
userId:1,
...
...
..
},
{
userId:2,
...},
{
userId:3,
...}];

User - [
{
userId - 1,
firstName - "John",
lastName - "Doe",
..
},
{
userId - 2,
firstName - "Jane",
lastName - "Doe",
..
}, {...}...
]

当我使用 Angular“example_entry in example”查看 Example 集合并显示 Example 集合元素时,我只有 userId 随时可用。但是如果我想显示名字和姓氏,我不能这样做,因为它在不同的“用户”集合中。 我必须编写一个辅助 Angular 控制器/服务方法来从 User 集合中获取 firstName、lastName 并将其与 Example 集合对象绑定。

为了避免这个问题,我可以对 Java Ojbects 进行反规范化并像这样发送准备好使用 JSON..

Example - [{
userId:1,
firstName - "John",
lastName - "Doe",
...
...
..
},
{
userId - 2,
firstName - "Jane",
lastName - "Doe",
...},
{
userId:3,
...}];

但这是好/坏/可怕吗?因为现在我的 Java 域对象在示例对象和用户对象中重复了名字、姓氏。有什么路线更好的建议吗?

De-Normalize and have ready to use JSON
Keep Data Normalized to avoid duplication and write converter methods on the Client as needed

【问题讨论】:

    标签: java javascript json angularjs normalization


    【解决方案1】:

    当您将数据发送到您的 UI 层时,您应该对数据进行非规范化。

    如果您的数据在数据库中,那么这是标准化数据的好地方。 使用抽象化规范化和查询视图的视图。该视图允许您将表连接在一起以从数据库中获取非规范化数据。

    在 UI 层中,您希望有清晰、简单的显示 - 这就是 angular 最能发挥作用的时候。除非您在屏幕上显示大量数据或通过网络发送大量数据,否则直接从数据库发送非规范化记录会更好。数据库非常擅长连接和其他数据查询功能——它就是为此而构建的。 Javascript可以做到这一点,但这并不是最好的使用方式。

    【讨论】:

      【解决方案2】:

      这是我对此的看法。在显示\列出数据时,我并不担心域模型\类。对我来说,返回的数据应尽可能匹配 UI 显示要求。这里的目的是向用户显示数据,并没有对此类屏幕进行太多决策。

      但是,如果需要更改\更新数据,则需要更加小心发送的内容,即哪些实体参与了更新。保持数据一致成为优先事项,在这种情况下可能不适合去规范化。

      【讨论】:

      • 这是否意味着我应该让后端 Java 类保持原样并编写帮助方法来将服务器端 JSON 转换为非规范化的 JSON?谢谢。
      • 如果是数据列表,请在数据库中创建一个包含必填字段的视图,然后通过您的应用代码查询它,无需转换。对于实体更新\数据更新场景,发送正确的数据实体,而不是对 bakend 进行任何非规范化
      • 但是,非规范化不会使数据库存储效率低下吗?现在,如果 fName 或 lName 发生变化,则需要在多个位置进行更新。现在使用的存储空间也更多了。这些不是问题吗?
      • 我根本不是在谈论存储。应规范存储。但是您始终可以在 DB 中进行连接并以非规范化形式返回数据,而不是返回多个表或发出多个请求。
      猜你喜欢
      • 2013-03-29
      • 1970-01-01
      • 2016-05-13
      • 2018-06-06
      • 1970-01-01
      • 2018-01-09
      • 2012-05-22
      • 2013-12-11
      相关资源
      最近更新 更多