我有一个Angular JS JSON客户端与JAVA / MySQL堆栈连接。 由于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。但是如果我想显示firstName和lastName,我不能这样做,因为它在不同的“User”集合中。 我必须编写一个帮助器Angular控制器/服务方法来从User集合中获取firstName,lastName并将其与Example集合对象绑定。
为了避免这个问题,我可以对Java Ojbects进行De-Normalize并发出准备使用这样的JSON ..
Example - [{
userId:1,
firstName - "John",
lastName - "Doe",
...
...
..
},
{
userId - 2,
firstName - "Jane",
lastName - "Doe",
...},
{
userId:3,
...}];
但这是好/坏/可怕吗?因为现在我的Java域对象具有firstName,LastName在示例对象和用户对象中重复。有关哪条路线更好的建议?
De-Normalize and have ready to use JSON
Keep Data Normalized to avoid duplication and write converter methods on the Client as needed
答案 0 :(得分:5)
将数据发送到UI层时,应该对数据进行非规范化。
如果您的数据位于数据库中,那么这是标准化数据的理想之地。 使用一个视图来抽象该规范化并对视图进行查询。该视图允许您将表连接在一起以从数据库中获取非规范化数据。
在UI图层中,您希望拥有清晰,简单的显示效果 - 即角度最佳时。除非您在屏幕上显示非常大量的数据或通过网络发送大量数据,否则只需直接从数据库发送非规范化记录,您就会好得多。 DB非常适合进行连接和其他数据查询功能 - 它是为此而构建的。 Javascript 可以这样做,但它不是最佳用途。
答案 1 :(得分:2)
这是我对此的看法。在显示\列表数据时,我并不担心Domain model \ classes。对我来说,返回的数据应该尽可能地匹配UI显示要求。这里的目的是向用户显示数据,而不是对这些屏幕做出太多决策。
但是如果需要更改数据\更新,则需要更加小心发送内容,哪些实体参与更新。保持数据一致成为优先事项,在这种情况下,反规范化可能不合适。