我有一系列python对象,每个对象都与不同的用户相关联,例如obj1.userID = 1
,obj2.userID = 2
等。每个对象也有一个表示为python dict的事务历史记录,即{ {1}}等。
我需要这些对象持久化,并且事务记录可能会随着时间的推移而增长。因此,我正在考虑使用像sqlalchemy这样的ORM来实现这一目标。
我需要指定哪种数据库模式来将这些对象存储在数据库中?
我有两种选择,但似乎都不是正确的事情:
obj2.transaction_record = {"itemID": 1, "amount": 1, "date": "2011-01-04"}
CREATE TABLE user_id ( itemID INT PRIMARY KEY, amount INT, date CHARACTER(10) );
有更简洁的方法来实现这个吗?
答案 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,这很容易学习。