2015-12-19 19 views
6

Tôi có một bảng tổ chức như thế này:Tìm kiếm dữ liệu từ các bảng năng động sử dụng Microsoft SQL Server

OrgID | OrgInviteCode | OrgName  | Status | ProjectTableName | InsertOn 
------------------------------------------------------------------------------------------- 
1 | RC12T67  | Organization1 | Active | Project1  | 2015-12-19 15:37:43.333 
2 | BC56uI7  | Organization2 | Active | Project2  | 2015-12-19 15:37:43.333 
3 | ORG1456  | Organization3 | Active | Project3  | 2015-12-19 15:37:43.333 
4 | ORG2856  | Organization4 | Active | Project4  | 2015-12-19 15:37:43.333 

Và tôi có một thủ tục lưu trữ để tạo ra một bảng năng động cho dự án.

Nếu có tổ chức mới được tạo thành công thì chúng tôi gọi thủ tục đã lưu trữ để tạo bảng dự án cho tổ chức đó.

Mỗi tổ chức có bảng dự án riêng. Vì vậy, tên bảng dự án là động cho mỗi tổ chức và tên của nó được lưu trữ trong bảng tổ chức.

Organization1 -> bảng Project

ProjectID | OrgID | ProjectName | ProjectInvideCode | Address1  | Address2 | City  |State | ZIP  | Country 
------------------------------------------------------------------------------------------------------------------------------- 
1   | 1 | Org1Proj1 | XJ34590   | 235 Harrison St. |   | Syracuse | AK  | 23456234 | US 
2   | 1 | Org1Proj2 | JKI8907   | 35 Sterling St. |   | Syracuse | NY  | 23456456 | US 

Organization2 -> bảng Project

ProjectID | OrgID | ProjectName | ProjectInvideCode | Address1 | Address2 | City  |State | ZIP | Country 
------------------------------------------------------------------------------------------------------------------------------- 
1   | 2 | Org2Proj1 | RUIO90   | 90 Ram St. |   | Los Angeles | CA | 23456234 | US 
2   | 2 | Org2Proj2 | KLOP907   | 35 Wide St.|   | Chicago  | IL | 23456456 | US 

Tôi hiện đang làm việc trong tích hợp tính năng tìm kiếm. Người dùng hoặc Người dùng ẩn danh có thể tìm kiếm dữ liệu dựa trên logic bên dưới:

  • Tìm kiếm với tên tổ chức hoặc mã mời tổ chức.
  • Tìm kiếm với tên dự án hoặc mã dự án.
  • Tìm kiếm với địa chỉ dự án, thành phố, tiểu bang, quốc

Tôi biết nó rất đơn giản để tìm ra kết quả tìm kiếm cho tên tổ chức và mời mã, bởi vì tất cả các nội dung là nằm trong cùng một bảng.

Nhưng sẽ phức tạp hơn nếu nhận được kết quả tìm kiếm cho các dự án (tên hoặc mã mời) do tên bảng động. Tôi tìm thấy liên kết này trong How to fetch data from dynamic multiple tables?, vì vậy tôi nghĩ rằng đó không phải là giải pháp tốt hơn vì tìm kiếm cần rất nhanh.

Lý do tại sao chúng tôi tách các bảng dự án dựa trên tổ chức vì trong yêu cầu của chúng tôi, chúng đề cập rõ ràng rằng "Chúng tôi có 1000000 tổ chức, nhưng mỗi tổ chức có hơn 1 triệu dự án". Hy vọng bạn hiểu khái niệm chúng tôi không muốn đổ các dự án 1000000 (Tổ chức) * 1 triệu = XXXXXX trong một bảng.

Câu hỏi:

  • Làm sao chúng ta có thể tìm kiếm các dữ liệu dự án theo cách hiệu quả?
  • Khái niệm bảng riêng biệt của dự án của chúng tôi có tệ nhất không? Bạn có bất cứ đề nghị để xử lý tốt hơn nhiều?
  • Có cách nào hiệu quả trong C# không?

Công cụ và Công nghệ:

  • Asp.Net 4.5, C#
  • MVC mã 5
  • Entity Framework đầu tiên
  • SQL Server 2012
+0

Hết sức tò mò, tại sao bạn không muốn đổ 1 triệu tổ chức với 1 triệu dự án vào một bảng? Tôi có nghĩa là, điều này nghe có vẻ như rất nhiều dữ liệu, vì vậy thay vì hack với SQL Server và các bảng 1T, có lẽ bạn cần một kiến ​​trúc cơ sở dữ liệu hiệu năng cao được phân phối thay thế? –

+0

@KeithPayne AFAIK nó không có ý nghĩa để giữ những dữ liệu trong bảng duy nhất .. Chúng tôi đã biết dữ liệu là rất lớn vì vậy trong khi xây dựng từ đầu chúng tôi phải thiết kế cơ sở dữ liệu với sự tôn trọng dữ liệu, khả năng mở rộng, hiệu suất vv .. – Chandru

+0

Bạn dự định có bao nhiêu bảng? 1 triệu tổ chức x 1 triệu dự án = 1 nghìn tỷ. Bạn có muốn thiết kế hệ thống để xử lý 1 nghìn tỷ bảng? Bạn đã kiểm tra các thông số kỹ thuật trên tối đa SQL Server chưa? Và sau đó, bạn sẽ lập chỉ mục danh sách các bảng như thế nào? Chỉ mục được sắp xếp phải được duy trì ở đâu đó để bạn có thể liên kết bảng của mình với dự án org +. Chỉ số sẽ được lưu trữ ở đâu? –

Trả lời

5

Tôi nghĩ rằng bạn có thể tạo XEM kết hợp tất cả các bảng dự án

SELECT 
    REPLACE(
     REPLACE( 
      REPLACE(
      (
       SELECT DISTINCT 'SELECT * FROM Organization O JOIN ' 
        + ProjectTableName 
        + ' PT ON O.OrgId = PT.OrgId WHERE O.OrgId = ' + convert(varchar(10), OrgId) 
        as [text()] FROM Organization 
       FOR XML PATH ('DELIMITER') 
      ), '</DELIMITER><DELIMITER>', ' 
      UNION ALL 
      '), '</DELIMITER>', '') 
    ,'<DELIMITER>', 'CREATE VIEW Organization_Projects 
AS 
') 

nó phải là khá gần trong hiệu quả cho các truy vấn trên các bảng nguồn.

+0

Bạn có nghĩ rằng, nó dễ dàng hơn nhiều trong NoSQL như mongodb, cassandra. – Chandru

+0

Nói chung, tôi không nghĩ vậy. Kho lưu trữ định hướng tài liệu có lợi cho dữ liệu với các lược đồ động. Trong trường hợp của bạn: nếu mọi tổ chức đều có một bảng dự án với tập hợp cột duy nhất thì có thể có ích khi sử dụng kho lưu trữ này. – Ingaz

2

Nếu bạn muốn tra cứu nhanh hơn, bạn có thể thực hiện việc này bằng cách thỏa hiệp trong thời gian ghi/chèn. Trong số ba điểm sau:

  • Tìm kiếm với tên tổ chức hoặc mã mời tổ chức.
  • Tìm kiếm với tên dự án hoặc mã dự án.
  • Tìm kiếm với địa chỉ dự án, thành phố, tiểu bang, quốc

Đầu tiên là straigt về phía trước như bạn nói. Cho phép xem xét 2 và 3. Tôi sẽ đề nghị một cách chung chung mà bạn có thể xử lý cả hai điểm, cho phép lấy địa chỉ làm ví dụ.

  1. Tạo bảng Địa chỉ với cột AddressId và Địa chỉ, chỉ lưu trữ địa chỉ duy nhất trong bảng này.Bạn có thể đặt địa chỉ làm khóa duy nhất. Lưu địa chỉId trong bảng Tổ chức và Dự án và không phải là địa chỉ đầy đủ. Điều này sẽ tiết kiệm không gian và tránh lỗi chính tả
  2. Tạo bảng OrganisationAddressBản đồ có id cột, AddressId, ProjectId và OrganisationId. Chỉ lưu trữ hàng duy nhất trong bảng này
  3. Khi bạn tìm kiếm địa chỉ, hãy xem trong hai bảng trên để xác định projectId và OrganisationId có liên quan. Và sau đó dựa trên hai bảng truy vấn id chính xác này.

Trong trường hợp trên, bạn sẽ phải tìm kiếm ít hàng không có địa chỉ. Tương tự, tạo hai bảng cho mỗi cụm từ truy vấn như tên dự án, mã thư mời dự án, thành phố, tiểu bang và quốc gia.

+0

Cảm ơn bạn đã trả lời. Nó giúp tôi. Vì vậy, bạn đề nghị tôi có tất cả các dự án trong một bảng. Tôi đúng không? Chúng tôi có một hộp tìm kiếm và người dùng có thể tìm kiếm (Orgname hoặc OrglnviteCode hoặc ProjName hoặc ProjlnviteCode hoặc Address etc ..) và chúng tôi phải lấy kết quả dựa trên các logic mà tôi đã đề cập. Theo giải pháp của bạn, bạn đang tách các cột không phải là hàng. – Chandru

+0

Có, tất cả các dự án trong một bảng có mục nhập duy nhất sẽ rất nhanh để tìm kiếm. Cùng với hộp tìm kiếm, bạn có thể thả xuống để chọn người dùng trường nào muốn tìm kiếm điều này sẽ làm cho tìm kiếm của bạn nhanh hơn bằng khoảng. 8 lần như bạn sẽ tìm kiếm trong chỉ một trong tám lĩnh vực và không phải tất cả. Bạn cũng có thể có tùy chọn là "tất cả" trong danh sách thả xuống trong trường hợp đó bạn sẽ tìm kiếm trong tất cả các bảng một. Nếu bạn cảm thấy đây là câu trả lời đúng, vui lòng đánh dấu nó là câu trả lời. – techExplorer

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