2016-01-24 74 views
0

我有一系列的Python对象,每一个不同的用户相关联,例如,obj1.userID = 1obj2.userID = 2,等等。每个对象也有一个交易历史表示为Python字典,即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));

  • 将交易记录字典存储为json的BLOB:
  • CREATE TABLE foo (userID INT PRIMARY KEY, trasaction_history BLOB);

    有没有更清晰的方法来实现这个?

    回答

    0

    你的例子似乎完全适合于关系数据库。您在用户和事务之间有一对一的关系,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的方法有:fully expressing and automating this

    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 
    
    +1

    感谢您的详细回复!我是SQLAlchemy的新手,我仍然在寻找解决方法。但这正是我想要实现它的方式。 – nihil0

    -1

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

    +0

    什么让你觉得你可以根据问题中的少量信息做出有根据的DBMS建议?有很多原因,MongoDB可能是OP的可怕选择。这个问题中的所有内容都可以在关系数据库中合理处理,OP似乎基于[tag:sqlite]标签使用。 – Chris

    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; 
    
    +0

    谢谢!这是实施它的更好方法。 – nihil0

    相关问题