[英]What kind of database schema would I use to store users' transaction histories?
我有一系列的python對象,每個對象都與一個不同的用戶相關聯,例如obj1.userID = 1
, obj2.userID = 2
等。每個對象還具有表示為python dict的事務歷史記錄,即obj2.transaction_record = {"itemID": 1, "amount": 1, "date": "2011-01-04"}
等。
我需要這些對象來保留,並且事務記錄可能會隨着時間增長。 因此,我正在考慮使用像sqlalchemy這樣的ORM來實現這一目標。
我需要指定哪種數據庫模式才能將這些對象存儲在數據庫中?
我有兩種選擇,但似乎都不是正確的選擇:
CREATE TABLE user_id ( itemID INT PRIMARY KEY, amount INT, date CHARACTER(10) );
CREATE TABLE foo ( userID INT PRIMARY KEY, trasaction_history BLOB);
有沒有更清潔的方法來實現這一目標?
與其將您的交易歷史視為大而易變的事物,不如將其視為不可變記錄的集合。 將每個記錄作為一行存儲在專用事務表中,例如
CREATE TABLE users (
id INTEGER PRIMARY KEY
);
CREATE TABLE transactions (
id INTEGER PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
amount INTEGER,
stamp TIMESTAMP
);
-- Repeat as necessary
INSERT INTO transactions (user_id, amount, stamp)
VALUES (1, 3, '2016-01-24 00:00:00');
現在,您可以插入單個記錄,並通過類似以下內容查看用戶的整個交易記錄
SELECT id, amount, stamp
FROM transactions
WHERE user_id = <SOME_USER_ID>
ORDER BY stamp ASC;
您的示例似乎完全適合於關系數據庫。 您與用戶和事務之間具有一對一的關系,SQLAlchemy ORM可以很好地表達這一點。
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
transaction_id = Column(Integer, ForeignKey('transaction.id'))
transaction = relationship(
"Transaction", uselist=False, backref=backref("user", uselist=False))
class Transaction(Base):
__tablename__ = 'transaction'
id = Column(Integer, primary_key=True)
amount = Column(Integer)
date = Column(DateTime, default=datetime.datetime.now)
接口:
>>> t = Transaction(amount=100)
>>> u = User()
>>> u.transaction = t
>>> session.add(u)
>>> session.commit()
>>> u = session.query(User).first()
>>> u.transaction.amount
100
>>> u.transaction.date
datetime.datetime(2016, 1, 24, 16, 21, 38, 683959)
我不知道為什么要將事務表示為任意Python對象,但是如果它具有可變列,則可以將事務對象編碼為JSON。 SQLAlchemy具有完全表達和自動化它的方式 :
class JSONEncodedDict(TypeDecorator):
"Represents an immutable structure as a json-encoded string."
impl = VARCHAR
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
如果您直到現在還沒有決定要使用哪種數據庫,我建議您選擇mongodb作為數據庫服務器和mongoengine模塊來保留數據,這就是您所需要的,mongoengine有一個DictField可存儲在其中直接使用python字典,非常容易學習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.