Tabela laczaca w relacji wiele do wielu i powtarzajace sie rekordy

0

Witam,

Projektuje baze do pewnej malej aplikacji i mam dylemat jak zrobic to zgodnie ze sztuka. Otoz mam tabele ze srodkami trwalymi w postaci komputerow oraz tabele z szablonami komponentow. Sa so tylko "szablony" wiec np "Dysk twardy 500GB" wystepuje tam tylko raz i moze byc przypisany nieskonczenie wiele razy do roznych komputerow. Oczywiscie niezbedna jest do tego tabela posrednia, jak to w relacji wiele do wielu, zawierajaca id komputera i id komponentu. I teraz pytanie: czy poprawnie jest jesli w takiej tabeli znajdzie sie wiele razy taki sam rekord (np 4 kosci pamieci przypisane do jednego komputera) czy powinien byc jeden rekord kosc pamieci-komputer i dodatkowa kolumna dla ilosci wystapien? Z punktu widzenia dzialania prostej aplikacji wydaje mi sie to obojetne, ale musze miec baze danych formalnie poprawna. Przy wielu powtorzeniach nie mozna zdefiniowac klucza glownego takiej tabeli.
Z gory dziekuje za porade.

0

Dodatkowe dane w tabeli łącznikowej to nic złego. Lepiej dać tam licznik. Bo wtedy "usuniecie" 1 kości z komputera nie będzie się wiazało z dziwnymi operacjami.
BTW klucz trzeba zdefiniować. Po prostu musiałby być sztuczny a nie złożony z dwóch łączonych id.

0

licznik:

klucz główny (komputer, podzespol)

dodawanie:

UPDATE komponenty SET licznik = licznik + 1 WHERE komputer = ? AND podzespol = ?
IF (@@ROWCOUNT == 0)
  INSERT INTO komponenty (komputer, podzespol, licznik) VALUES (?, ?, 1)

usuwanie:

UPDATE komponenty SET licznik = licznik - 1 WHERE komputer = ? AND podzespol = ?
DELETE FROM komponenty WHERE komputer = ? AND podzespol = ? AND licznik < 1 -- można przerzucić na trigger

wiele wierszy:

klucz główny (id)
dodatkowy indeks (komputer, podzespol)

dodawanie:

INSERT INTO komponenty (komputer, podzespol) VALUES (?, ?)

usuwanie:

DELETE FROM komponenty WHERE id = (SELECT TOP 1 id FROM komponenty WHERE komputer = ? AND podzespol = ?)

przy liczniku trochę więcej kodu, ale dodawanie wielu wierszy niepotrzebnie zwiększa wielkość bazy - nie tylko rekordy są zdublowane, ale potrzebny jest też dodatkowy indeks
jednak w przypadku jeśli dodajemy tylko po 2 / 3 komponenty do komputera to nie robi za dużej różnicy

pamiętaj tylko że jeżeli wybierzesz drugą opcję (chyba bardziej naturalną) to nadaj wierszom id, inaczej ich pojedyncze usunięcie będzie trudne w przypadku większości dbms

0

Dzieki za podpowiedzi. Co do implementacji nie mam z tym problemu, bardziej chodzilo mi o porade teoretyczna. Tak jak mi sie wydawalo klucz powinien byc, wiec zrobie chyba wersje z licznikiem. Chociaz osobna linia dla komponentu jest kuszaco prosta bo updatowanie mam zrobione w ten sposob ze komponenty sa w formularzu na liscie multiselect i przy update wywalam wszystkie nalezace do danego kompa i dodaje wszystkie na nowo z ew. zmianami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1