Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MSSQL Server 2008 - optymalizacja
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
grudziu
Hej,
jestem na etapie wykonywania projektu na studia. Mam taki problem:

Założenia:
Jest sobie tabelka główna powiedzmy KSIĄŻKI , z nią w realcji typu JEDEN do WIELU tabelaka z osobami (relacja AUTORZY) bo założenie jest, że jedna ksiązka ma jednego autora, jeden autor moze napisać wiele książek. Dalej jest relacja WIELE do WIELU z Recenzentami. Czyli wiele osób daje recenzje dla pojedynczej książki, jeden recenzent recenzuje wiele ksiązek.

Czyli mam KSIĄZKI, w niej atrybut tytuł oraz Id_osoby.

Relacja wiele-do-wielu jest realizowana pośrednio przez tabelkę RECENZENCI, czyli mam jeszcze tabelkę RECENZENCI, a w niej relację Id_Ksiązki, Id_osoby.

Ostatnia tabelka to OSOBY z polem Id_osoby oraz Nazwisko.

Do łatwego wyświetlenia za pomocą PHP chciałem skorzystać z perspektywy z INNER JOIN, ale po pierwsze: w perspektywnie nie można dwa razy się odnośić do tego samego pola bo on nie wie które łączyć.

  1. CREATE VIEW Ksiazki_widok (
  2. Id, Tytul, A_nazwisko, R_nazwisko
  3. )
  4. AS SELECT KSIAZKI.Id_ksiazki , KSIAZKI.Tytul , Osoby.Nazwisko , Osoby.Nazwisko FROM KSIAZKI
  5.  
  6. --autorzy jeden do wielu
  7. INNER JOIN Osoby ON KSIAZKI.Id_osoby = Osoby.Id_osoby
  8. --recenzenci wiele do wielu
  9. INNER JOIN Recenzenci ON KSIAZKI.Id_ksiazki = Recenzenci.Id_ksiazki
  10. INNER JOIN Osoby ON Osoby.Id_osoby= Recenzenci.Id_osoby


Wyskauje błąd - Osoby.Id_osoby już istnieją. A więc nie nakierowałem go, że ma podmienić tylko w pierwszym wpisie Osoby.Nazwisko, a w drugim wpisie skorzystać z drugiego złączenia INNER JOIN. Czy ktoś ma pomysł jak powinienem to zrealizować?


Drugie pytanie:
Jak w łatwy sposób zrobić wyświetlenie wyników perspektywy bez dublowania poszczególnych pól? Tzn jeżeli mamy wiele recenzentów, to po inner join powstanie taka tabela jak poniżej:

TYTUL: Podstawy myslenia AUTOR: Miki Loki RECENZENT: Jan Mana
TYTUL: Podstawy myslenia AUTOR: Miki Loki RECENZENT: Kijan Minit
TYTUL: Podstawy myslenia AUTOR: Miki Loki RECENZENT: Roger Buj

Ja bym wolał mieć taki wynik w perspektywie:
TYTUL: Podstawy myslenia AUTOR: Miki Loki RECENZENT: Jan Mana, Kijan Minit, Roger Buj

Da radę to jakoś uzyskać?
Zyx
Odnośnie problemu pierwszego, to w każdej szanującej się bazie korzystającej z SQL-a masz coś takiego, jak aliasy. Składnie są dwie:

Kod
nazwatabeli alias


Kod
nazwatabeli AS alias


Później możesz odwoływać się do kolumn w danej tabeli za pośrednictwem aliasu, tj. alias.pole, a co ważniejsze - możesz mieć stworzonych kilka niezależnych aliasów na tę samą tabelę.

Problem 2 -> to jest właśnie naturalny sposób pracy baz danych. Jeśli chcę je pokazywać w innej formie, stosownych przeróbek dokonuję już po stronie aplikacji, która te dane przetwarza i wyświetla.
grudziu
Dzięki za pomoc, ale z aliasami próbowałem na prawo i lewo jakoś to powiązać z poleceniem Create View i się nie dało. Skorzystałem również z polecenia kopiowania tabeli jako OsobyR, ale to nie jest dobre rozwiązanie, bo aktualizując dane w perspektywie aktualizuje się kopie a nie orginały

Przedstawiam dwa rodzaje polecenia, które próbowałem uruchomić, ale wyrzucało błędy

a)
  1. CREATE VIEW Ksiazki_widok (
  2. Id, Tytul, A_nazwisko, R_nazwisko
  3. )
  4. AS SELECT KSIAZKI.Id_ksiazki , KSIAZKI.Tytul , Osoby.Nazwisko , Osoby.Nazwisko AS OsobyR FROM KSIAZKI
  5.  
  6. --autorzy jeden do wielu
  7. INNER JOIN Osoby ON KSIAZKI.Id_osoby = Osoby.Id_osoby
  8. --recenzenci wiele do wielu
  9. INNER JOIN Recenzenci ON KSIAZKI.Id_ksiazki = Recenzenci.Id_ksiazki
  10. INNER JOIN OsobyR ON OsobyR.Id_osoby= Recenzenci.Id_osoby
- błąd Invalid object name 'OsobyR'.

b )

  1. SELECT Nazwisko FROM Osoby AS OsobyR
  2. GO
  3. CREATE VIEW Ksiazki_widok (
  4. Id, Tytul, A_nazwisko, R_nazwisko
  5. )
  6. AS SELECT KSIAZKI.Id_ksiazki , KSIAZKI.Tytul , Osoby.Nazwisko FROM KSIAZKI
  7.  
  8. --autorzy jeden do wielu
  9. INNER JOIN Osoby ON KSIAZKI.Id_osoby = Osoby.Id_osoby
  10. --recenzenci wiele do wielu
  11. INNER JOIN Recenzenci ON KSIAZKI.Id_ksiazki = Recenzenci.Id_ksiazki
  12. INNER JOIN OsobyR ON OsobyR.Id_osoby= Recenzenci.Id_osoby

błąd Invalid object name 'OsobyR
Dodam że Create View w sql 2008 musi być pierwszym poleceniem po GO a wewnątrz można tylko użyć jednego SELECT i wiele INNER JOIN. Tak samo wkrótce czeka mnie problem, bo chciałem na perspektywę transakcję założyć, ale ciągle wyrzuca błędy, że to perspektywa ma być pierwsza po go itp.

Odnośnie drugiego problemu: tak myślałem... to co przedsatwiam powyżej to część mojej bazy (baza nawet nie jest o książkach smile.gif ) stworzona na potrzebę łątwego przedstawienia problemu. Docelowo będę miał trochę takich zdublowanych pól i obróbka ich to nie będzie prosta sprawa z punktu widzenia programistycznego - kod chciałbym mieć przejrzysty i czysty. Ale boję się, że np przy 1000 rekordach, które będzie można zmniejszyć do 300 to obróbka będzie długo trwałą
Zyx
Widzę tutaj jedynie aliasy na kolumny, a nie na tabele. Komunikat mówi jasno: baza nie wie, co to jest OsobyR.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.