Kto powinien być właścicielem w relacji jeden do jednego?

0

Załóżmy, że mamy subskrypcje i użytkowników. Jeden użytkownik może mieć tylko jedną subskrypcję. Są dwa rozwiązania, żeby to wymusić:

  1. Klucz obcy subscription_id w tabelce users.
  2. Klucz obcy user_id w tabelce subscriptions, ale dodany unique.

Czy jakieś rozwiązanie ma więcej wad/zalet?

Przykład nr 2:
User ma avatar, albo oferta ma tylko jedno główne zdjęcie (może mieć pińcet). Ustawiamy odpowiednio users.avatar_id do tabelki z plikami i to samo dla ofert klucz main_photo_id, czy jakoś inaczej?

Wiem, że to wszystko można wymusić z poziomu aplikacji, ale chciałbym, żeby do mojej bazy pod żadnym pozorem nie mogło trafić g**no.

2

Subscriptions / Users - przed implementacją trzeba się zastanowić jak się te byty mają do siebie / jakie są "reguły biznesowe".

  • Czy użytkownik musi/może mieć subskrypcję?
  • Czy użytkownik może mieć więcej niż 1 subskrypcję?
  • Czy subskrypcja może być dzielona przez użytkowników?
  • Czy mogą istnieć subskrypcje bez użytkowników?
  • Czy mogą istnieć użytkownicy bez subskrypcji?

Zaraz pewnie powiesz, że "to oczywiste" (ale dla Ciebie, bo masz te reguły w głowie :-) )

-- edited: Wróć, relacja 1-1, nie doczytałem w temacie :-)

Wydaje mi się, że to zależy jaką relację modelujesz, np.
Użytkownik -- kupuje -- Subskrypcję (user ma FK do Subscrkypcji)
Subksrypcja -- należy do -- Użytkownik (Subskrypcja ma FK do Użytkownika)

Czy w systemie potrzebujesz jednej z relacji, obydwie ?

0

A czy jedno nie wynika z drugiego? Użytkownik kupuje subskrypcje, więc subskrypcja należy do użytkownika. Chociaż jak dluzej nad tym myślę, to FK w tabeli z użytkownikami ma więcej sensu w tym wypadku. Naturalnie wymuszamy jeden do jednego.

Trochę mniej pewności mam co do drugiego przypadku. Oferta ma kilka zdjęć, ale tylko jedno jest główne. Tutaj jest relacja jeden do wielu. Pytanie, czy to oferta ma główne zdjęcie (offers FK do zdjęć), czy to zdjęcie jest głównym zdjęciem dla danej oferty (flaga is_main w tabelce ze zdjęciami).

W tym wypadku wydaje mi się, że pierwsze rozwiązanie ma więcej sensu, bo też na poziomie bazy wymuszamy jedno główne zdjęcie, bo jest tylko jedna kolumna, która pomieści jedną wartość.

2

W pierwszym rozwiązaniu (subscription_id w tabeli users) zawsze jest ryzyko, że mamy triggera na zmianę danych osobowych, które jak można się domyslać są w tabeli users. To de facto wymóg przez RODO (ale nie tylko, ja to dużo wcześniej już stosowałem). Każda zmiana subskrypcji (nie wiem, czy jest możliwa) powoduje uruchomienie triggera.

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