Wpis z mikrobloga

Zagadnienie formalne z projektowania baz danych:

Mam w bazie danych obiekt "płatnej subskrypcji". Za taką subskrypcję użytkownik może zapłacić sobie sam, albo może mu zapłacić organizacja. Zazwyczaj taki problem rozwiązywałem w taki (lub zbliżony) sposób:

table Subscription_payer (

subscriptionId int, -- subskrypcja, za którą zapłacono

payerType enum('user', 'organisation'), -- rodzaj płatnika

payerId int -- identyfikator płatnika w odpowiedniej tabeli

)

W bazach robionych przez innych również tak to rozwiązywano.

Problemem, przynajmniej w #mysql, jest to, że

payerId
nie może być kluczem obcym, bo nie wiadomo do której tabeli się odnosi.

Wymyśliłem dwa rozwiązania - rozbić tą tabelę na dwie (

subscription_payer_user
,

subscription_payer_organisation
), albo wprowadzić nadrzędny obiekt

Payer
, który byłby źródłem kluczy obcych dla tabel

User
i

Organisation
. Oba rozwiązania mają minusy - pierwsze nie gwarantuje unikalności, i pozwala na istnienie dwóch płatników dla jednej subskrypcji; drugie tworzy trochę za dużo bytów jak dla mnie - a podobnych problemów mogę jeszcze kilka mieć.

Coś jednak zrobić muszę - więc zapytuję mirków, którego rozwiązania by użyli i dlaczego. A może np. w #oracle lub #postgresql ma jakieś inne rozwiązania?

#bazydanych #sql
  • 3
  • Odpowiedz
@singollo: Chyba zrobil bym to tak, ze albo subskrybcja jest zaznaczona jako oplacona samodzielnie, i wtedy payerID jest null, albo niesamodzienlie i wtedy payerID jest FK do innej tabeli.

Nie znam bazy gdzie moglbys zrobic klucz obcy do wielu tabel z tej samej kolumny.

No i poztsaje jeszcze kwestia unikalnosci - co jesli userID i orgID beda takie same..?
  • Odpowiedz
@prezes_n: no głównie dlatego, że organizacja nie jest użytkownikiem - chociaż ma użytkowników. Ale rozwiązałem ten problem, znajdując logiczne umiejscowienie tabeli payer
  • Odpowiedz