簡體   English   中英

我將使用哪種數據庫模式來存儲用戶的交易歷史記錄?

[英]What kind of database schema would I use to store users' transaction histories?

我有一系列的python對象,每個對象都與一個不同的用戶相關聯,例如obj1.userID = 1obj2.userID = 2等。每個對象還具有表示為python dict的事務歷史記錄,即obj2.transaction_record = {"itemID": 1, "amount": 1, "date": "2011-01-04"}等。

我需要這些對象來保留,並且事務記錄可能會隨着時間增長。 因此,我正在考慮使用像sqlalchemy這樣的ORM來實現這一目標。

我需要指定哪種數據庫模式才能將這些對象存儲在數據庫中?

我有兩種選擇,但似乎都不是正確的選擇:

  1. 每個用戶都有一個不同的表:

CREATE TABLE user_id ( itemID INT PRIMARY KEY, amount INT, date CHARACTER(10) );

  1. 將交易歷史記錄存儲為json的BLOB:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM