Прежде чем я опишу свою проблему, я бы хотел увести пару вещей с пути:
- Я опытный (хотя и не эксперт) дизайнер баз данных. Я считаю, что хорошо понимаю реляционную модель.
- У меня нет такого твердого понимания реляционной модели, что я точно знаю, что делать в любой ситуации. Я все еще учусь.
Допустим, мы получаем электронную таблицу Excel раз в месяц из банка, но не всегда в одном и том же банке. Электронная таблица содержит всего шесть столбцов: название банка, номер счета, остаток на счете, имя клиента (владельца счета), SSN клиента и адрес владельца счета. У каждой строки есть свой номер счета, и номер счета не указан более чем в одной строке. Мы хотим импортировать эту электронную таблицу в базу данных и в любой момент в будущем сказать: «Какой адрес был у Джона Смита 13 октября 2010 года?»
Для простоты предположим, что у каждого клиента есть только один адрес, и что у каждого клиента может быть ноль или более учетных записей. И на секунду давайте представим, что нам нужно выполнить только один импорт листа Excel, КОГДА-ЛИБО, что является глупой предпосылкой, но терпите меня. Если это так, будет достаточно следующего дизайна:
bank
--------
id
name
account
--------
id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
Остальная часть моего вопроса основана на предпосылке, что вы согласны с тем, что эта схема является «правильной», так что, надеюсь, у вас все в порядке.
Теперь, это было бы хорошо, если бы мы только когда-либо делали один импорт, но мы будем делать 12 импортов на банк в год. Вот как я думал об этом:
bank
--------
id
name
account
--------
id
import_id
bank_id
customer_id
number
balance
customer
--------
id
name
ssn
address
city
state_id
zip
state
--------
id
name
import
--------
id
date
excel_file (blob)
Теперь каждая учетная запись привязана к импорту, и мы можем с уверенностью сказать, что «Счет 12345 пришел из импорта 572 13.10.10». Потенциально становится немного более двусмысленным, когда вы смотрите, скажем, на таблицу customer
. Поскольку в таблице customer
меньше строк, чем в таблице account
(поскольку у некоторых клиентов есть несколько учетных записей), у нас нет такого отношения один к одному между клиентами и импортом, как у нас для счетов и импорта , Я знаю, что нет потери данных и нет потери целостности данных, но это все равно похоже на какую-то жертву.
Мой вопрос (и это может быть слишком открытым): Как вы думаете, это хороший способ хранения данных? Вы сделали бы это по-другому?
Редактировать: есть важный способ думать об этих сущностях, о которых вы должны знать. Не думайте о account
как об одной учетной записи, которая существует со временем. Представьте себе account
как снимок учетной записи в определенный момент времени . Таким образом, счет 12345 с балансом $ 100 НЕ совпадает с account
, как счет 12345 с балансом $ 150. Да, обе записи в реальном мире привязаны к одному и тому же банковскому счету, но я храню снимок учетной записи в определенный момент времени. Аналогичная (но не идентичная) ситуация с клиентами.