2012-05-31 17 views
7

Tôi có một câu đố cũ, vì vậy tôi nghĩ tôi sẽ chia sẻ nó với bạn, có thể sẽ đi đúng hướng. Thing, rằng một số thực thể trong cơ sở dữ liệu khá lớn (đọc có nhiều thuộc tính), và hiếm khi logic nghiệp vụ sử dụng tất cả các thuộc tính thực thể, vì vậy mỗi khi tôi cần phải nghĩ những thuộc tính nào phải được tải cho logic nghiệp vụ để hoạt động chính xác. mẫu rất giả:Thực thể làm quá nhiều?

public class Product 
{ 
    public string Title {get;set;} 
    public string Description {get;set;} 

    public string RetailPrice {get;set;} 
    public string SupplierId {get;set;} 

    public Supplier Supplier { get;set;} 

    // many other properties 
} 

public class ProductDiscountService 
{ 
    public decimal Get(Product product) 
    { 
     // use only RetailPrice and Supplier code 
     return discount; 
    } 
} 

public class ProductDescriptionService 
{ 
    public string GetSearchResultHtml(Product product) 
    { 
     // use only Title and Description 
     return html; 
    } 
} 

Dường như tôi có thể trích xuất các giao diện IDiscountProduct và ISearchResultProduct, sản phẩm đánh dấu như thực hiện những giao diện, sau đó tạo ra DTOs nhỏ thực hiện mỗi người giao diện, nhưng mà nhìn vào các thời điểm như quá mức cần thiết (ít nhất Tôi chưa thấy bất kỳ nhóm thuộc tính nào sử dụng giao diện).

Để tách thực thể trong cơ sở dữ liệu thành các thực thể nhỏ hơn cũng không hợp lý, vì tất cả các thuộc tính đó đều thuộc sản phẩm và tôi e rằng tôi sẽ bị buộc phải sử dụng nhiều lần tham gia để chọn thứ gì đó và nếu tôi quyết định một số tài sản thuộc về một thực thể khác, động thái đó sẽ khá khó thực hiện.

Để có mọi thuộc tính được sử dụng trong logic nghiệp vụ của phương pháp cụ thể vì thông số phương pháp cũng trông giống như giải pháp xấu.

+0

Chúng ta đang nói về bao nhiêu thuộc tính? – walther

+0

thường lớn hơn 10, nhỏ hơn 20. – Giedrius

+0

Tôi sẽ nói: nếu phương pháp của bạn biết trước các thuộc tính nào cần sử dụng và điều này vẫn cố định, việc sử dụng các tham số có thể là một giải pháp tốt. Dễ kiểm tra và dễ sử dụng lại. Tuy nhiên, nếu việc thực hiện không được xác định trong chữ ký phương thức (thực hiện hiện tại sử dụng 2 thuộc tính nhưng ngày mai chúng có thể trở thành 3), bạn muốn tiêu thụ toàn bộ Sản phẩm với tất cả các thuộc tính có sẵn. Điều này nói một cách nhất quán: Phương pháp này yêu cầu các tham số này và phương pháp này đòi hỏi một sản phẩm. – Polity

Trả lời

1

Trừ khi thuộc tính lớn (đọc chuỗi dài và/hoặc nhị phân), tôi chỉ tải tất cả.

Các điểm dưới đây là dành cho các thuộc tính đơn giản (ví dụ như Tiêu đề)

  1. Không có mã phụ (có được sản phẩm này với tiêu đề duy nhất, hoặc nhận được với giá chỉ, blah-blah)
  2. Một ví dụ sản phẩm luôn luôn là hoàn chỉnh, vì vậy bạn có thể vượt qua nó mà không kiểm tra xem thuộc tính có rỗng không.
  3. Nếu bạn sẽ phải tải xuống một số thuộc tính khác, bạn sẽ mất nhiều thời gian hơn khi tải chúng một cách háo hức. Nếu bạn có 20 thuộc tính - đây không phải là một đối tượng lớn (một lần nữa, nếu thuộc tính Mô tả (giả định) của bạn không có kích thước kilobyte).

Bây giờ, nếu bạn có các đối tượng liên quan (ProductSupplier) - điều này sẽ được tải xuống, trừ khi bạn biết thuộc tính này sẽ được sử dụng.

+0

Vâng, trong mô tả dự án thực là html, vì vậy một vài kilobyte là trường hợp thông thường.Một điều nữa, đó là vì bản chất của mô hình kinh doanh của chúng tôi, chúng tôi thường xử lý một lượng lớn sản phẩm (hàng nghìn), vì vậy việc tải xuống không được chấp nhận vì số lượng truy vấn lớn. Vì vậy, nếu bạn có hàng ngàn sản phẩm và kilobyte trong tài sản, nó trở nên khá quan trọng những gì bạn tải từ cơ sở dữ liệu :) Tôi đã suy nghĩ về việc đặt một số lưu trữ đọc nhanh như reddis ở giữa, miễn là có nhiều lần đọc hơn viết. – Giedrius

+0

Phụ thuộc vào loại xử lý. Khi chúng ta phải làm việc với một lượng lớn dữ liệu trong quá khứ - chúng ta chỉ nạp nó vào bộ nhớ, và làm việc ở đó, nhưng tập đó chỉ đọc .. và chúng ta đã kết thúc giải pháp đó và quay trở lại cơ sở dữ liệu. Dù sao, trong trường hợp của bạn tôi nghĩ rằng tôi muốn đo lường mức độ thường xuyên bạn thực sự cần các tài sản, và những gì là tác động thực tế của tải chúng háo hức. Tôi vẫn không nghĩ rằng một số Kb cho mỗi kỷ lục là nhiều - ngay cả khi bạn có một vài (5-10?) Hàng ngàn hồ sơ, đó chỉ là một vài MB để được đọc. Có một chỉ số thích hợp sẽ quan trọng hơn rất nhiều. – Evgeni

+0

Reddis hoặc memcached có thể đáng xem. Phụ thuộc vào nhu cầu của bạn, nhưng một cái gì đó như RavenDB cũng có thể giúp ích cho bạn. – Evgeni