W mySQL funkcjonalne relacje obsługuje InnoDB. W myISAM można użyc składnie REFERENCES ale właściwie tylko dla dokumentacji.
Jeśli chodzi o przechowywanie faktur itp, ja to robię tak.
Jedna tabela na dane "nagłówkowe" + dodatki o których za chwilę
Kod
DROP TABLE IF EXISTS `faktury`;
CREATE TABLE `faktury` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Klucz podstawowy',
`IDodbiorcy` int(10) unsigned NOT NULL COMMENT 'ID odbiorcy',
`status` enum('BUFOR','ANULOWANE','ZATWIERDZONE') NOT NULL DEFAULT 'BUFOR' COMMENT 'Stan dokumentu',
`nrDokumentu` varchar(20) NOT NULL COMMENT 'Nr dokumentu',
`dataSprzedazy` date NOT NULL COMMENT 'Data Sprzedazy',
`dataWystawienia` date NOT NULL COMMENT 'Data Wystawienia',
`sprzedawcaNazwa` varchar(255) NOT NULL COMMENT 'Nazwa sprzedawcy',
`sprzedawcaAdres` varchar(255) NOT NULL COMMENT 'Adres sprzedawcy',
`sprzedawcaNIP` varchar(25) NOT NULL COMMENT 'NIP sprzedawcy',
`sprzedawcaBank` varchar(255) NOT NULL COMMENT 'Bank sprzedawcy',
`sprzedawcaKonto` varchar(100) NOT NULL COMMENT 'Konto sprzedawcy',
`sposobZaplaty` enum('GOTOWKA','PRZELEW','GOTOWKA/PRZELEW') NOT NULL COMMENT 'Sposób zapłaty',
`terminZaplaty` varchar(511) NOT NULL COMMENT 'Termin zapłaty',
`odbiorcaIndeks` char(7) NOT NULL COMMENT 'Indeks odbiorcy',
`odbiorcaNazwa` varchar(255) NOT NULL COMMENT 'Nazwa odbiorcy',
`odbiorcaKodPocztowy` char(6) NOT NULL COMMENT 'Kod pocztowy odbiorcy',
`odbiorcaMiejscowosc` varchar(255) NOT NULL COMMENT 'Miejscowość odbiorcy',
`odbiorcaAdres` varchar(255) NOT NULL COMMENT 'Adres odbiorcy',
`odbiorcaNIP` char(13) NOT NULL COMMENT 'NIP odbiorcy',
`rabat` decimal(3,2) NOT NULL DEFAULT '0.00' COMMENT 'Rabat',
`osobaWystawiajaca` varchar(255) NOT NULL COMMENT 'Osoba wystawiająca',
`upowaznienie` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Zgoda na wystawianie faktury bez podpisu',
`szablonWydruku` varchar(30) NOT NULL COMMENT 'Sablon wydruku',
`wydrukRabat` enum('WIERSZE','PODSUMOWANIE','UKRYTY') NOT NULL DEFAULT 'WIERSZE' COMMENT 'Opcje wydruku rabatu',
`sumaEgz` int(6) NOT NULL,
`sumaNetto` decimal(8,2) NOT NULL,
`sumaVat` decimal(8,2) NOT NULL,
`sumaBrutto` decimal(8,2) NOT NULL,
PRIMARY KEY (`ID`));
Druga tabele na dane "wierszowe" (świadomie nie do końca znormalizowana)
Kod
DROP TABLE IF EXISTS `faktury_wiersze`;
CREATE TABLE `faktury_wiersze` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Klucz podstawowy',
`dokumentID` int(10) unsigned NOT NULL COMMENT 'Wskazuje na fakturę',
`towarID` int(10) unsigned NOT NULL COMMENT 'Wskazuje na towar',
`indeks` char(6) NOT NULL COMMENT 'Indeks towaru',
`towarDoWydruku` varchar(255) NOT NULL COMMENT 'Towar w wersji do wydruku',
`ilosc` int(5) NOT NULL COMMENT 'Ilosc',
`PKWiU` varchar(10) NOT NULL COMMENT 'Symbol PKWiU',
`cenaNetto` decimal(6,2) NOT NULL COMMENT 'Cena netto',
`stawkaVat` decimal(3,2) NOT NULL COMMENT 'Stawka VAT',
`wartoscNetto` decimal(8,2) NOT NULL,
`wartoscVat` decimal(8,2) NOT NULL,
`wartoscBrutto` decimal(8,2) NOT NULL,
PRIMARY KEY (`ID`))
Obciąłem trochę z rzeczywistych definicji, a;e mniej więcej tak to wygląda.