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.
TABLE charges ------------ charge_id INT PK base ENUM (notification, announcement, download, ...) record_id INT amount DECIMAL
TABLE notifications ------------ notification_id INT PK content VARCHAR(160)
TABLE announcements ------------ announcement_id INT PK content TEXT
TABLE downloads ------------ download_id INT PK 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