W innej tabeli zakładam referencję na ten słownik postaci
... IdTekst int references Language(Id)
... i tu pojawia się problem, bo ID w poprzedniej tabeli nie jest kluczem.
Oczywiście mógłbym to złożenie robić już w Views, ale mnie chodzi o
ustanowienie referencji już na etapie tworzenia tabel. Samo ID na indeks sie
nie nadaje, bo nie jest unikalne, dopiero złóżenie ID,Typ daje nam indeks
unikalny, ale to i tak nie zmiena postaci rzeczy....
Czy ktoś z szanownych grupowiczów miał taki problem i rozwiązał go
Pozdrawiam
Krzysztof Kozłowski
> Oto zagadnienie : mam tabele języków (id,typ,tekst) , w której pamiętany
> jest taki przykładowy zestaw rekordów
> 12,1,"KOT"
> 12,2,"CAT"
> 12,3,"KATZE"
> Oczywiście liczby 1,2,3 to typ języka - odpowiednio PL, GB, DE.
>
> W innej tabeli zakładam referencję na ten słownik postaci
> ... IdTekst int references Language(Id)
>
> ... i tu pojawia się problem, bo ID w poprzedniej tabeli nie jest kluczem.
> Oczywiście mógłbym to złożenie robić już w Views, ale mnie chodzi o
> ustanowienie referencji już na etapie tworzenia tabel. Samo ID na indeks sie
> nie nadaje, bo nie jest unikalne, dopiero złóżenie ID,Typ daje nam indeks
> unikalny, ale to i tak nie zmiena postaci rzeczy....
Witam
Rozumiem ze nie masz w tabeli w ktorej zakladasz referencje pola Typ.
Widze 2 rozwiazania tego problemu:
1.Zamiast referencji uzyc trigerow i sprawdzac czy wstawiany Id istnieje
tabeli do ktorej chcesz zrobic referencje. W przypadku gdy nie istnieje
generowac blad. Trzeba by tez zrobic obsluge paru innych rzeczy aby
dzialalo to jak foregin key. Ale to wydaje mi sie troche
lewe, bo jest dosc sporo pisania, ale jak by Cie interesowalo takie
rozwiazanie, a nie wpadlbys jak za pomoca trigerow zastapic FK to
daj cynk, a ja wysle wysle Ci instrukcje.
Choc swoja droga to w bazie na ktorej w tej chwili pracuje (ponad 700
tabel) prawie wszystkie referencje sa zrobione za pomoca trigerow.
2.Zmienic strukture bazy danych. Dodac dodatkowa tabele, w ktorej mialbys
tylko Id wyrazu i ewentualnie jakies pola ktore nie maja zwiazku z
jezykiem. A tabela jezykowa ktora masz w tej chwili bylaby taka jak teraz.
Wydaje sie to troche nadmiarowe jesli mialbys umiescic tam tylko Id, lecz
w przypadku gdy masz oprocz tego jakies inne pola niezalezne od kodu
jezyka to jest sensowne. Tak jest to przynajmniej rozwiazane w bazie nad
oprogramowaniem ktorej pracuje.
Pozdrowka
Mundek
Ja również i toserdecznie
2.Zmienic strukture bazy danych. Dodac dodatkowa tabele, w ktorej mialbys
tylko Id wyrazu i ewentualnie jakies pola ktore nie maja zwiazku z
jezykiem. A tabela jezykowa ktora masz w tej chwili bylaby taka jak teraz.
Wydaje sie to troche nadmiarowe jesli mialbys umiescic tam tylko Id, lecz
w przypadku gdy masz oprocz tego jakies inne pola niezalezne od kodu
jezyka to jest sensowne. Tak jest to przynajmniej rozwiazane w bazie nad
oprogramowaniem ktorej pracuje.
Aby trochę rozjaśnić przedstawię obecna strukturę (wycinek kodu ze skrypty)
:
--------------------------------------------
print ' Tworze slowniki jezykow ... '
create table TypLan -- definicja - typy slownikowe
( IdTypLan smallint primary key clustered, -- indeks jezyka
Skr char(21) not null, -- wartosc skrocona jezyka
Naz char(50) not null, -- wartosc pelna jezyka
)
create table StdLan -- slownik jezykow
( IdStdLan int identity(1,1) primary key clustered, -- indeks wartosci
slownikowaj
Typ smallint references TypLan(IdTypLan), -- referencja na slownik typow
Skr char(21) not null, -- wartosc skrocona jezykowa
Naz char(50) not null, -- wartosc pelan jezykowa
Opi char(255) DEFAULT '- Brak opisu -', -- wartosc opisowa jezykowa
)
go
-------------------------
i tu pojawia się problem, którego nie przewidziałem, w tym słowniku będzie
możliwy tylko jedna wartość id nazwy(wartości)
powinno być :
( IdStdLan int , -- indeks wartosci slownikowaj
Typ smallint references TypLan(IdTypLan), -- referencja na slownik typow
Skr char(21) not null, -- wartosc skrocona jezykowa
Naz char(50) not null, -- wartosc pelan jezykowa
Opi char(255) DEFAULT '- Brak opisu -', -- wartosc opisowa jezykowa
)
create unique clustered index StdLanIndex on StdLan(IdStdLan,Typ) -- tworze
unikal;ny indeks na dwoch polach
... ale w tym momencie nie moge zrobić referencji z innej tabeli na
StdLan(IdStdLan) bo nie ma takiego indeksu..
Przykład
------
create table Arch -- ewidencja Arch
( IdArch int identity(1,1) primary key clustered, -- indeks Arch unikalny
IdSkr int references StdLan(IdStdLan), -- indeks skroty ze slownika
jezykowego (*bląd*)
IdNaz int references StdLan(IdStdLan), -- indeks nazwy pelnej ze
slownika jezykowego (*bląd*)
IdOpi int references StdLan(IdStdLan), -- indeks opisu ze slownika
jezykowego (*bląd*)
Logo image default null, -- Logo firmy, projektu, produktu ...
)
-----------
I tu leży mój problem...
Czy teraz jest jaśniej
Pozdrowka
Mundek