Просто интересно, есть ли у вас мнение о следующем.
Представьте, что у меня есть простое приложение, которое хранит счета для клиентов.
Для упрощения таблицы счетов:
ID int,
NUMBER varchar(20)
CustomerID INT
Данные клиента:
ID int
Number varchar(20)
Name varchar(30)
TaxID varchar(20)
...
Теперь, поскольку я хочу сохранить свои счета-фактуры с исходными данными клиента (так что данные, которые клиент имеет в то время, когда они были напечатаны), я хочу избежать изменения исходных данных клиента в какой-то момент, поскольку в противном случае все прошлые счета-фактуры также будут изменяться.,
Какой лучший подход?
Это, по существу, разница между ссылочными данными и нереляционными данными. Чтобы избежать референтной проблемы всегда доступа к текущей информации о клиенте, вам необходимо написать информацию о клиенте, как это было в то время, в таблице счетов. Таким образом, ваша схема таблицы счетов будет больше похожа:
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)
...
Таким образом, данные всегда будут отображаться как есть, а не так, как сейчас. Недостатком является то, что вы храните больше данных, так как не пользуетесь нормализацией.
Если вы предпочитаете не хранить информацию с помощью счета-фактуры (я бы этого не делал), другим решением было бы отслеживать изменения данных 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
. В любом случае это можно легко выполнить с помощью триггеров.
Спасибо, ребята, за все идеи. Тем временем я придумал какое-то другое возможное решение, и мне интересно, что вы думаете об этом.
В основном у меня будет 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