Witam serdecznie!
Projektuje bazę (MySQL) dla serwisu internetowego, który będzie świadczył różne usługi, przykładowo:
- wysłanie SMS-a
- zlecenie publikacji ogłoszenia na stronie
- pobranie pliku ze strony
itd.

Każda usługa musi być rejestrowana, czyli
przy wysłaniu SMS-a, informacja jest zapisywana do tabeli notifications
przy publikacji ogłoszenia, rekord do announcements
przy pobraniu, rekord do downloads
itd.

Warunek:
- nie wszystkie usługi są płatne (np. wysłanie 10 SMS-ów jest darmowe, ale za kolejne jest opłata)
- wybrany użytkownik może mieć darmowy dostęp do pobierania
- publikowanie ogłoszeń może być różnie wyceniane
itd.

Ogólnie mówiąc, elastyczny system rozliczania sprzedanych usług.

Istota sprawy tkwi w tym, żeby użytkownik mógł na końcu miesiąca zobaczyć za co dokładnie został obciążony kwotą X zł. Trzeba więc stworzyć tabele w której będą wszystkie obciążenia rejestrowane, np. tabela charges.
  1. TABLE charges
  2. ------------
  3. charge_id INT PK
  4. base ENUM (notification, announcement, download, ...)
  5. record_id INT
  6. amount DECIMAL


  1. TABLE notifications
  2. ------------
  3. notification_id INT PK
  4. content VARCHAR(160)



  1. TABLE announcements
  2. ------------
  3. announcement_id INT PK
  4. content TEXT



  1. TABLE downloads
  2. ------------
  3. download_id INT PK
  4. filename VARCHAR(30)


Liczy się w sumie tylko tabela charges. W przedstawionym przykładzie odwołuje się ona do innych tabel (notifications, downloads, announcements lub dowolnych innych w zależności co jest w kolumnie "base" (typ wyliczeniowy), podane jest także ID rekordu (record_id) do którego konkretnie się odwołuje. Jest to swojego rodzaju klucz obcy, ale pod warunkiem ze base = notification to record_id = notifications.notification_id, base = download, wiec record_id = downloads.download_id

Dzięki temu użytkownik może zobaczyć, ze ma do zapłaty Y zł za 3 ogłoszenia (tutaj ich lista), X zł za SMS-y (billing szczegółowy), Q zł za pobrania plików (też dokładna lista pobrań).

Z tego co szukałem nie ma możliwości utworzenia takiego klucza na poziomie bazy MySQL. Można tylko sprawdzać na poziomie aplikacji integralność danych, co jednak czasem jest zawodne i daje mniejsze bezpieczeństwo niż więzy między tabelami.

Czy jest jakiś sposób na zrobienie tego w MySQL?
Ewentualnie czy ktoś z Was robił coś podobnego i zna inne, efektywniejsze rozwiązanie?

Z góry bardzo dziękuje za wszelką pomoc!
Krzysiek