Mysql (db design) - хранение счетов, которые начинаются с 1 каждый год - PullRequest
1 голос
/ 05 января 2011

Как лучше всего хранить счета в одной таблице. Первичный ключ генерируется автоматически, но номер счета начинается с номера 1. Каждый год.

Это нормально?

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

Столбец номера счета начинается с 1 в начале года.

Спасибо:)

EDIT: Проблема: Как определить, когда год заканчивается / начинается?

Идея: создать еще одну таблицу на годы. Когда наступает время закрытия года (установите столбец, например, для 2010, установите значение «Открыто = 0») и добавьте строку для нового года (например, установите поле «Открыто = 1» для значения 2011).

Новая схема:

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`)

Ответы [ 4 ]

1 голос
/ 05 января 2011

Да. Все в порядке. Я делаю это так. Включение уникального ключа (год, invoice_number) поможет избежать случайных ошибок.

Еще одна вещь, которую вы должны учитывать: если счет будет «отменен» или «удален», вы захотите разрешить «переработку» использованного номера или нет. Если да, то установка может быть немного более сложной.

0 голосов
/ 05 января 2011

Другой способ выполнить это - создать таблицу следующим образом:

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

Результатом этого является то, что каждый год новый счет-фактура сбрасывается автоматически. Результат будет примерно таким:

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

Однако следует отметить, что если вы удалите счет-фактуру, и счет-фактура будет иметь самый последний номер за этот год, этот номер будет использоваться повторно. Однако, если вы удалите накладную 3, указанную выше, она не будет использоваться повторно.

0 голосов
/ 05 января 2011

Другая идея - использовать составной ключ и с автоматически увеличивающимся номером счета.

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 |
+------+----------------+

Недостатком (и я лично считаю это большим) является то, что нет простого способа перенести это поведение на другие базы данных.

Обновлено Как отмечено в комментариях, «поведение сброса» работает только с таблицами MyISAM . Это еще больший недостаток, потому что вы не сможете использовать InnoDB (что необходимо для данных такого типа).

0 голосов
/ 05 января 2011

Вы можете сделать свой первичный ключ составным полем invoice_number и year.

Это устраняет необходимость в автоинкрементном идентификаторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...