2013-09-22 33 views
6

Tôi có một góc client JS JSON interfacing với JAVA/MySQL stack. Vì MySQL là một RDBMS, tất cả dữ liệu của tôi được chuẩn hóa (ba dạng đầu tiên của khóa học).Normalization vs denormalization khi sử dụng một khách hàng JSON với JAVA/RDBMS chồng

Câu hỏi của tôi có thể được minh họa bằng ví dụ sau.

Tôi có đối tượng Ví dụ và đối tượng Người dùng được máy chủ trả về.

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

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

Khi tôi xem qua bộ sưu tập Ví dụ sử dụng Góc "example_entry in example" và hiển thị phần tử Lấy mẫu, tôi chỉ có sẵn userId. Nhưng nếu tôi muốn hiển thị firstName và lastName, tôi không thể làm như nó trong bộ sưu tập "Người dùng" khác. Tôi phải viết một helper Điều khiển góc/dịch vụ phương pháp để có được firstName, lastName từ bộ sưu tập người dùng và buộc nó với các đối tượng bộ sưu tập mẫu.

Để tránh vấn đề này, tôi có thể De-Đồng hóa Ojbects Java và gửi ra đã sẵn sàng để sử dụng JSON như thế này ..

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

Nhưng là tốt/xấu/khủng khiếp này? Bởi vì bây giờ đối tượng miền Java của tôi có firstName, LastName trùng lặp trong đối tượng ví dụ và cũng là đối tượng người dùng. Bất kỳ lời khuyên nào về tuyến đường nào tốt hơn?

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

Trả lời

2

Đây là việc tôi thực hiện việc này. Khi nói đến hiển thị \ danh sách dữ liệu tôi không lo lắng về các mô hình miền \ lớp học. Đối với tôi, dữ liệu được trả về phải khớp với các yêu cầu hiển thị giao diện người dùng càng nhiều càng tốt. Ở đây, mục đích là hiển thị dữ liệu cho người dùng và không đưa ra quyết định nhiều về màn hình như vậy.

Nhưng nếu dữ liệu cần phải được thay đổi \ cập nhật người ta cần phải cẩn thận hơn về những gì là gửi, mà các đơn vị tham gia vào updation. Giữ cho dữ liệu nhất quán trở thành ưu tiên và khử chuẩn hóa có thể không phù hợp trong các trường hợp như vậy.

+0

Liệu nó có nghĩa là tôi nên rời khỏi lớp học phụ trợ Java như nó vốn có và viết phương pháp helper để chuyển đổi JSON server-side để một JSON de-bình thường? Cảm ơn. – user6123723

+0

Nếu đó là danh sách dữ liệu, hãy tạo chế độ xem với các trường bắt buộc trong DB và chỉ truy vấn nó thông qua mã ứng dụng của bạn, không cần chuyển đổi. Đối với một thực thể cập nhật \ dữ liệu cập nhật kịch bản gửi các thực thể dữ liệu chính xác thay vì làm bất kỳ normalization trên bakend – Chandermani

+0

Nhưng sẽ không làm cho db lưu trữ không hiệu quả với không chuẩn hóa? Bây giờ nếu fName hoặc lName thay đổi, nó cần được cập nhật ở nhiều nơi. Ngoài ra không gian lưu trữ được sử dụng hiện nay còn nhiều hơn nữa. Những vấn đề này có phải không? – user6123723

4

Bạn nên chuẩn hóa dữ liệu của mình khi bạn gửi dữ liệu đến lớp giao diện người dùng.

Nếu dữ liệu của bạn nằm trong cơ sở dữ liệu, đó là nơi tuyệt vời cho dữ liệu được chuẩn hóa. Sử dụng chế độ xem tóm tắt việc chuẩn hóa và truy vấn đó đối với chế độ xem. Khung nhìn cho phép bạn nối các bảng lại với nhau để lấy dữ liệu không chuẩn hóa từ cơ sở dữ liệu của bạn.

Trong lớp UI bạn muốn có rõ ràng hiển thị, rất đơn giản - đó là khi góc chiếu sáng tốt nhất. Trừ khi bạn đang hiển thị số lượng dữ liệu rất lớn trên màn hình hoặc gửi số tiền khổng lồ qua mạng, bạn sẽ trả giá tốt hơn nhiều bằng cách chỉ gửi một bản ghi không chuẩn hóa ngay từ db của bạn. DB là tuyệt vời khi thực hiện các phép nối và các hàm truy vấn dữ liệu khác - nó được xây dựng cho điều đó. Javascript có thể làm điều đó, nhưng nó không phải là cách sử dụng tốt nhất của nó.

Các vấn đề liên quan