我将使用哪种数据库架构来存储用户的交易历史记录?

时间:2016-01-24 17:17:42

标签: python sqlite sqlalchemy

我有一系列python对象,每个对象都与不同的用户相关联,例如obj1.userID = 1obj2.userID = 2等。每个对象也有一个表示为python dict的事务历史记录,即{ {1}}等。

我需要这些对象持久化,并且事务记录可能会随着时间的推移而增长。因此,我正在考虑使用像sqlalchemy这样的ORM来实现这一目标。

我需要指定哪种数据库模式来将这些对象存储在数据库中?

我有两种选择,但似乎都不是正确的事情:

  1. 为每个用户设置不同的表格:
  2. obj2.transaction_record = {"itemID": 1, "amount": 1, "date": "2011-01-04"}

    1. 将交易历史记录dict存储为json的BLOB:
    2. CREATE TABLE user_id ( itemID INT PRIMARY KEY, amount INT, date CHARACTER(10) );

      有更简洁的方法来实现这个吗?

3 个答案:

答案 0 :(得分:0)

不要将事务历史视为一个大的,可变的事物,而应将其视为不可变记录的集合。将每条记录作为一行存储在专用的事务表中,例如

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;

答案 1 :(得分:0)

您的示例似乎完全适合关系数据库。您在用户和事务之间存在一对一的关系,而SQLAlchemy ORM可以很好地表达这一点。

type ExprC = 
    | StrC of string
    | BoolC of bool
    | IntC of int32
    | DecC of decimal
    | ArrayC of int * array<ExprC>
    | RelC of RelationC
and RelationC = Dictionary<string, ExprC>        

接口:

[<CustomEquality; CustomComparison>]
type MyDict() =
    inherit Dictionary<string, ExprC>()
    override this.Equals x =
        match x with
        | :? MyDict as y -> (this = y)
        | _ -> false

    override this.GetHashCode () =
        hash this

    interface System.IComparable with
      member x.CompareTo yobj =
          match yobj with
          | :? MyDict as y -> compare x y
          | _ -> invalidArg "MyDict" "cannot compare values of different types"

and [<StructuralEquality;StructuralComparison>] ExprC =
    | IntC of int
    | StrC of string
    | MapC of MyDict

我不知道为什么要将事务表示为任意Python对象,但如果它具有变量列,则只需将事务对象编码为JSON即可。 SQLAlchemy有fully expressing and automating this

的方法
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)

答案 2 :(得分:-1)

如果到目前为止你还没有决定使用什么样的数据库,我建议你选择mongodb作为数据库服务器和mongoengine模块来保存数据,这就是你需要的,mongoengine有一个DictField你可以直接存储python dict,这很容易学习。