2015-12-19 22 views
6

Mam tabelę organizacji takiego:wyszukiwania danych z dynamicznych tabel przy użyciu 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 

I mam procedurę przechowywaną, aby stworzyć dynamiczny stół do projektu.

Jeśli jakakolwiek nowa organizacja zostanie pomyślnie utworzona, wywołujemy procedurę składowaną w celu utworzenia tabeli projektu dla tej organizacji.

Każda organizacja ma swoją własną tabelę projektów. Tak więc nazwa tabeli projektu jest dynamiczna dla każdego org i jego nazwa jest przechowywana w tabeli organizacji.

Organization1 -> tabela Projekt

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 -> tabela Projekt

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 

Obecnie pracuję w integracji funkcji wyszukiwania. Użytkownicy lub użytkownicy anonimowi mogą wyszukiwać dane na podstawie poniższej logiki:

  • Wyszukaj za pomocą nazwy organizacji lub kodu zapraszającego organizacji.
  • Wyszukaj za pomocą nazwy projektu lub kodu zaproszenia do projektu.
  • Szukaj z adresem projektu, miasto, województwo, kraj

Wiem, że to bardzo proste, aby znaleźć wyniki wyszukiwania dla nazwy organizacji i zaprosić kod, bo cała zawartość jest przebywa w tej samej tabeli.

Ale bardziej skomplikowane jest uzyskanie wyniku wyszukiwania dla projektów (nazwa lub kod zaproszenia) z powodu dynamicznej nazwy tabeli. Znalazłem ten link w How to fetch data from dynamic multiple tables?, więc myślę, że to nie jest lepsze rozwiązanie, ponieważ wyszukiwanie musi być bardzo szybkie.

Powód, dla którego rozdzielamy tabele projektów na podstawie organizacji, ponieważ w naszym wymaganiu wyraźnie mówią, że "Mamy 1000000 organizacji, ale każda organizacja ma ponad 1 milion projektów". Mam nadzieję, że rozumiesz pojęcie, że nie chcemy zrzucać projektów 1000000 (organizacja) * 1 milion = XXXXXX w jednej tabeli.

Pytania:

  • Jak możemy przeglądać dane projektów w efektywny sposób?
  • Czy koncepcja oddzielnego stołu w naszym projekcie jest najgorsza? Czy masz jakieś sugestie, aby poradzić sobie w dużo lepszym?
  • Czy jest jakiś skuteczny sposób w C#?

Narzędzia i Technologia:

  • Asp.Net 4.5, C#
  • MVC pierwszy kod 5
  • Entity Framework
  • SQL Server 2012
+0

Z ciekawości, dlaczego nie chcesz zrzucić organizacji 1M z 1 milionami projektów w jedną tabelę? Mam na myśli, że brzmi jak wiele danych, więc zamiast hackowania z SQL Server i tabele 1T, może potrzebujesz zamiast tego rozproszone architektury bazy danych wysokiej wydajności? –

+0

@KeithPayne AFAIK nie ma sensu utrzymywać tych danych w jednej tabeli. Wiemy już, że dane są dużo większe, więc budując od zera, musimy zaprojektować bazę danych pod względem danych, skalowalności, wydajności itp. – Chandru

+0

Ile stołów planujesz? 1 milion organizacji x 1 milion projektów = 1 trylion. Czy chcesz zaprojektować system do obsługi 1 biliona stołów? Czy sprawdziłeś specyfikacje na maksymalnych SQL Server? A następnie, jak indeksować twoją listę stołów? Uporządkowany indeks musi być gdzieś przechowywany, aby można było powiązać tabelę z projektem org +. Gdzie będzie przechowywany indeks? –

Odpowiedz

5

myślę, że można tworzyć WIDOK łącząc wszystkie tabele projektu

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 
') 

to musi być bardzo blisko w Efektywność zapytań na tabelach źródłowych.

+0

Czy uważasz, że w NoSQL jest o wiele łatwiej, jak mongodb, cassandra. – Chandru

+0

Ogólnie nie sądzę. Przechowywanie zorientowane na dokumenty jest korzystne dla danych z dynamicznymi schematami. W twoim przypadku: jeśli każda organizacja ma tabelę projektów z unikalnym zestawem kolumn, to może być korzystne korzystanie z tych magazynów. – Ingaz

2

Jeśli chcesz szybsze wyszukiwanie, możesz to zrobić, przechodząc na kompromis podczas zapisu/wstawiania. Z następujących trzech punktów:

  • Wyszukaj z nazwą organizacji lub zaproszeniem organizacji.
  • Wyszukaj za pomocą nazwy projektu lub kodu zaproszenia do projektu.
  • Szukaj z adresem projektu, miasto, województwo, kraj

Pierwszy jest straigt przodu jak pan powiedział. Spójrzmy na 2 i 3. Sugeruję ogólny sposób, w jaki można obsłużyć oba punkty, przyjmijmy adres jako przykład.

  1. Utwórz tabelę Adres z kolumną Adres i adres, przechowuj tylko unikalny adres w tej tabeli.Możesz wprowadzić adres jako unikalny klucz. Zapisz adres w tabeli Organizacja i projekt, a nie pełny adres. Pozwoli to zaoszczędzić miejsce i uniknąć błędu ortograficznego. Stwórz tabelę OrganizeAddressMap z identyfikatorem kolumny, ID adresu, ID projektu i identyfikatorem organizacyjnym. Przechowuj tylko unikalny wiersz w tej tabeli.
  2. Podczas wyszukiwania adresu spójrz w dwie powyższe tabele, aby zidentyfikować odpowiednie ID projektu i OrganisationId. A następnie na podstawie tych dwóch ids kwerendy prawidłową tabelę.

W powyższym scenariuszu będziesz szukał bardzo niewielu wierszy adresu. W podobny sposób utwórz dwie tabele dla każdego zapytania, takie jak nazwa projektu, kod zaproszenia do projektu, miasto, województwo i kraj.

+0

Dziękuję za odpowiedź. Pomaga mi. Sugerujesz więc, abym wszystkie projekty znalazły się w jednym stole. Mam rację? Mamy jedno pole wyszukiwania i użytkownik może wyszukiwać (Orgname lub OrglnviteCode lub ProjName lub ProjlnviteCode lub Adres itp.) I musimy uzyskać wynik na podstawie logiki, o której wspomniałem. Według twojego rozwiązania dzielisz kolumny, a nie wiersze. – Chandru

+0

Tak, posiadanie wszystkich projektów w jednej tabeli z unikatowym wprowadzeniem będzie bardzo szybkie w wyszukiwaniu. Wraz z polem wyszukiwania możesz podać rozwijane menu, aby wybrać pole, które użytkownik chce przeszukać, co przyspieszy wyszukiwanie o około. 8 razy, jak będziesz wyszukiwał tylko jedno z ośmiu pól, a nie wszystkie. Możesz także wybrać opcję "wszystko" w rozwijanym menu, w którym to przypadku będziesz przeszukiwać wszystkie tabele jeden po drugim. Jeśli uważasz, że jest to poprawna odpowiedź, zaznacz ją jako odpowiedź. – techExplorer

Powiązane problemy