2011-01-05 5 views
1

Was ist der beste Weg, um Rechnungen in einer Tabelle zu speichern. Der Primärschlüssel wird automatisch generiert, die Rechnungsnummer beginnt jedoch mit der Nummer 1 für jedes Jahr.Mysql (db design) - Speichern von Rechnungen, die von 1 jedes Jahr beginnt

Ist das OK?

invoces 
------------------------------------------------ 
`id` int UNSIGNED NOT NULL AUTO_INCREMENT , 
`invoice_number` int NOT NULL , 
`year` year NOT NULL , 
etc... 
PRIMARY KEY (`id`)

Rechnungsnummer Spalte wird von 1 auf Jahresbeginn starten.

Thanks :)

EDIT: Problem: Wie determin, wenn ein Jahr endet/beginnt?

Idee: Erstellen Sie eine weitere Tabelle für Jahre. Wenn die Zeit nahe an das Jahr kommt (Spalte für Beispiel 2010 festlegen = 0) und eine Zeile für neues Jahr hinzufügen (z. B. gesetztes Feld = 1 für 2011).

Neues Schema:

invoces 
------------------------------------------------ 
`id` int UNSIGNED NOT NULL AUTO_INCREMENT , 
`invoice_number` int NOT NULL , 
`fk_year_id` year NOT NULL , 
etc... 
PRIMARY KEY (`id`)
invoces_year 
------------------------------------------------ 
`id` int UNSIGNED NOT NULL AUTO_INCREMENT , 
`year` year NOT NULL , 
`opened` tinyint NOT NULL 
PRIMARY KEY (`id`)
+0

die Rechnungsnummer sollte der Primärschlüssel sein - warum sollten Sie dies jedes Jahr zurücksetzen? –

+0

@ f00: Weil Kunden das so wollen. Zeitraum. – Mchl

+0

@Mchl: Genau :) – Buco

Antwort

1

Yup. Das ist gut. Ich mache es so. Mit UNIQUE key (Jahr, Rechnungsnummer) vermeiden Sie versehentliche Fehler.

Noch eine Sache, die Sie in Betracht ziehen sollten, ist: Wenn die Rechnung jemals "storniert" oder "gelöscht" wird, wollen Sie die verwendete Nummer "recyceln" lassen oder nicht. Wenn ja, dann kann das Setup etwas komplizierter werden.

+0

Nicht sicher über: EINZIGARTIGER Schlüssel an (Jahr, Rechnungsnummer) ... – Buco

+0

Es ist nicht unbedingt notwendig, aber ich bin prettu sicher, dass Ihre Abfragen auch davon profitieren könnten. – Mchl

0

Sie könnten Ihre Primärschlüssel eine Verbindung Feld INVOICE_NUMBER und Jahr.

Dadurch entfällt die Autoinkrementierungs-ID.

+1

Auf der anderen Seite mit einem einzigen Feld PK, die in keiner Weise an Geschäftsdaten gebunden ist, ist viel einfacher. – Mchl

0

Eine weitere Idee ist es, einen zusammengesetzten Schlüssel und eine automatisch inkrementierende Rechnungsnummer zu verwenden.

create table invoices(
    year   int not null 
    ,invoice_number int not null auto_increment 
    ,primary key(year, invoice_number) 
); 

insert into invoices(year) values(2009); 
insert into invoices(year) values(2009); 
insert into invoices(year) values(2009); 

insert into invoices(year) values(2010); 
insert into invoices(year) values(2010); 
insert into invoices(year) values(2010); 

select * 
    from invoices; 

+------+----------------+ 
| year | invoice_number | 
+------+----------------+ 
| 2009 |    1 | 
| 2009 |    2 | 
| 2009 |    3 | 
| 2010 |    1 | 
| 2010 |    2 | 
| 2010 |    3 | 
+------+----------------+ 

Der Nachteil (und ich persönlich denke, dies ist groß) ist, dass es von der Portierung dieses Verhalten auf andere Datenbanken keine einfache Möglichkeit ist.

Aktualisiert Wie bereits in den Kommentaren aus, das "Verhalten Reset" funktioniert nur mit MyISAM Tabellen. Dies ist ein noch größerer Nachteil, da Sie InnoDB nicht verwenden können (was Sie für diese Art von Daten tun sollten).

+0

Beachten Sie, dass dies nur mit MyISAM funktioniert. Ich würde es schwer haben, Rechnungsdaten in nicht ACID-konformen Tabellen zu speichern. – Mchl

+0

Ich habe über Compound Key nachgedacht ... und immer noch ... denke ... Ich würde es lieber vermeiden wenn möglich ... denke immer noch ... – Buco

+0

@Mchl: Ich benutze InnoDB. Also, nicht darüber nachdenken ... – Buco

0

andere Möglichkeit, dies durchzuführen wäre die Tabelle zu erstellen, wie folgt:

CREATE TABLE invoices(
invoiceyear int, 
invoiceid int AUTO_INCREMENT , 
amount decimal, 
PRIMARY KEY (invoiceyear, invoiceid) 
)

Das Ergebnis davon ist, dass jedes Jahr eine neue InvoiceID automatisch zurückgesetzt wird. Das Ergebnis wäre so etwas wie diese:

 
invoiceyear invoiceid amount 
2011 1 1 
2011 2 1 
2011 3 1 
2010 1 1 
2010 2 1 
2011 4 1 

Es sollte jedoch beachtet werden, dass, wenn Sie eine Rechnung löschen und die Rechnung hat die neueste Zahl für dieses Jahr, dann wird diese Nummer wieder verwendet werden. Wenn Sie Rechnung 3 jedoch entfernen, wird diese nicht erneut verwendet.

+0

Dies ist das gleiche wie Ronnis – Buco

+0

Und mit dem gleichen Kommentar: funktioniert nur mit MyISAM;) – Mchl