데이터베이스에 돈을 지속시킵니다. 디자인 결정
-
06-07-2019 - |
문제
금융 거래 상태를 저장하려면 테이블이 필요합니다. 이 거래의 상태는이 클래스에 의해 대략 모델링 될 수 있습니다.
class FinancialTransaction
{
Integer txId,
Money oldLimit,
Money newLimit,
Money oldBalance,
Money newBalance,
Date txDate
}
class Money
{
Currency curr,
BigDecimal amount
}
스키마의 초기 설계는 다음과 같습니다.
CREATE TABLE tx
(
txId bigint(20) unsigned NOT NULL,
oldlimit_currency varchar(3) NULL,
oldlimit_amount decimal(7,5) default 0.00,
newlimit_currency varchar(3) NULL,
newlimit_amount decimal(7,5) default 0.00,
----snipped----
PRIMARY KEY (txId)
)
두 가지가 나를 걱정합니다.
- 각 거래는 하나의 통화에 따라 발생합니다. 여러 통화로 발생할 수있는 거래를 지원 해야하는지 여부에 대해서는 충분히 생각하지 못했습니다. 변하지 않는다고 가정합니다. 그렇다면 하나의 통화 열만 유지하는 것이 더 공간 효율적이지 않습니까? 이 단순한 솔루션을 후회할까요?
- 각 돈 항목이 가치 객체이므로 대신 모든 머니 객체를 별도의 돈 테이블에 저장하고 원래 테이블에 MoneyIds를 돈 테이블의 외국 열쇠로 사용하도록해야합니까?
그건,
CREATE TABLE tx
(
txId bigint(20) unsigned NOT NULL,
oldlimit_money_id int NOT NULL,
newlimit_money_id int NOT NULL,
----snipped----
PRIMARY KEY (txId),
FOREIGN KEY (oldlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY (newlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION
)
대체 디자인이 있습니까?
감사합니다 LazyWeb.
해결책
통화와 화폐 가치는 두 가지 다른 개념이므로 분리하는 것이 좋습니다. '값'에 대한 별도의 테이블을 만들 필요는 없지만 통화에 대해서는 별도의 엔티티이기 때문에 통화에 대한 테이블을 갖는 것이 좋습니다. 새로운 디자인은 다음과 같습니다.
CREATE TABLE tx
(
id bigint(20) unsigned primary key,
old_limit_currency_id int not null references CURRENCY(id),
old_limit_value decimal(7,5) not null,
new_limit_currency_id int not null references CURRENCY(id),
new_limit_value decimal(7,5) not null
)
또한 10 진수 (7,5)가 시나리오에 충분한 공간이 있는지 확인하면 조금 낮아 보입니다. "미안보다 안전하다":) :)
다른 팁
- 앞으로 두 통화 사이의 거래를 지원 해야하는 경우 각 통화 중 하나로 두 개의 트랜잭션으로이를 모델링 할 수 있어야합니다.
- 당신의 돈 대상은 의미 적으로 엔티티가 아닌 가치 인 것 같습니다. 따라서 나는 그것들을 엔티티로 분리 할 필요가 없다.
세 번째 아이디어는 어떻습니까 :
CREATE TABLE tx
(
txId bigint(20) unsigned NOT NULL,
currency varchar(3) NOT NULL,
oldlimit decimal(7,5) default 0.00,
newlimit decimal(7,5) default 0.00,
----snipped----
PRIMARY KEY (txId)
)
한 거래의 모든 돈 가치는 동일한 통화 여야합니다.
과잉이 아닌 경우 한 걸음 더 나아가 모든 금액/값을 단일 통화로 저장하고 환율 테이블을 유지하십시오.
제휴하지 않습니다 StackOverflow