База данных - Исторические данные

1

Просто интересно, есть ли у вас мнение о следующем.

Представьте, что у меня есть простое приложение, которое хранит счета для клиентов.

Для упрощения таблицы счетов:

ID int,
NUMBER varchar(20)
CustomerID INT

Данные клиента:

ID int
Number varchar(20)
Name varchar(30)
TaxID varchar(20)
...

Теперь, поскольку я хочу сохранить свои счета-фактуры с исходными данными клиента (так что данные, которые клиент имеет в то время, когда они были напечатаны), я хочу избежать изменения исходных данных клиента в какой-то момент, поскольку в противном случае все прошлые счета-фактуры также будут изменяться.,

Какой лучший подход?

  • 0
    хранить данные о клиентах также со счетом ...
  • 0
    Анджей, это то, чего я действительно хотел бы избежать. Главным образом потому, что если моя таблица клиентов изменится, мне придется изменить схему таблицы счетов и т. Д. И т. Д.
Теги:
database

3 ответа

2

Это, по существу, разница между ссылочными данными и нереляционными данными. Чтобы избежать референтной проблемы всегда доступа к текущей информации о клиенте, вам необходимо написать информацию о клиенте, как это было в то время, в таблице счетов. Таким образом, ваша схема таблицы счетов будет больше похожа:

ID int
NUMBER varchar(20) <-- also why is a column called NUMBER a varchar?!
CustomerID INT
CustomerNumber varchar(20)
CustomerName varchar(30)
CustomerTaxID varchar(20)
...

Таким образом, данные всегда будут отображаться как есть, а не так, как сейчас. Недостатком является то, что вы храните больше данных, так как не пользуетесь нормализацией.

  • 1
    Счета "цифры" с альфа-символами не являются редкостью.
  • 0
    @DStanley ааа, новости для меня. Слишком много думать как программист, недостаточно как бизнесмен.
Показать ещё 4 комментария
1

Если вы предпочитаете не хранить информацию с помощью счета-фактуры (я бы этого не делал), другим решением было бы отслеживать изменения данных Customer с таблицей следующим образом:

HistoricID INT,
CustomerID INT,
....
ValidFrom DateTime NOT NULL,
ValidTo DateTime (NOT NULL) //read below for reason of ()

Вы можете сделать это двумя способами: Вставить в эту таблицу при вставке в таблицу Customer затем обновить строку, чтобы поле ValidTo имело значение плюс вставлять строку каждый раз, когда вы обновляете таблицу Customer. Или вы можете вставлять строку каждый раз, когда вы обновляете таблицу Customer отражающую предыдущую информацию.

Если вы переходите к последнему, ValidTo должен быть NOT NULL, и вам нужно будет добавить поле ModifiedDate в таблицу Customer. В любом случае это можно легко выполнить с помощью триггеров.

0

Спасибо, ребята, за все идеи. Тем временем я придумал какое-то другое возможное решение, и мне интересно, что вы думаете об этом.

В основном у меня будет 2 таблицы Consumer - один, который содержит статические данные, такие как номер телефона, код электронной почты и т.д. И т.д., А другой - данные клиента. После важных изменений данных я просто добавлю детали в таблицу подробностей, и этот идентификатор будет использоваться в таблице счетов так:

[Customer]
ID int
Code varchar(20) 
....
Phone

[CustomerDetails]
ID INT
CustomerID Int
Name ...
Address
And other important data that I need to track

[Invoice]
ID
Number
CustomerDetailsID INT

На первый взгляд кажется, что он работает нормально.

С уважением, Seb

Ещё вопросы

Сообщество Overcoder
Наверх
Меню