Database design 数据库中的个人消息系统
我是数据库新手,想知道如何在数据库中最好地存储个人消息(使用SQLAlchemy) 因为我不确定,我尝试了下表的经前综合症Database design 数据库中的个人消息系统,database-design,sqlalchemy,Database Design,Sqlalchemy,我是数据库新手,想知道如何在数据库中最好地存储个人消息(使用SQLAlchemy) 因为我不确定,我尝试了下表的经前综合症 pm_table = Table('personal_message', metadata, Column('id', Integer, primary_key=True, autoincrement=True), Column('from_id', Integer, ForeignKey('user.id')), Column('to_id'
pm_table = Table('personal_message', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('from_id', Integer, ForeignKey('user.id')),
Column('to_id', Integer, ForeignKey('user.id')),
Column('message', Text),
Column('sent_at', DateTime)
)
然后这个被映射
session.mapper(User, user_table, properties={
'messages_sent': relation(PM, backref='sender'),
'messages_received': relation(PM, backref='receiver')
})
我收到以下错误消息:
无法确定关系User.messages\u上的父/子表之间的联接条件。指定“primaryjoin”表达式。如果这是一个多对多关系,那么还需要“secondaryjoin”
据我目前所知,这是一种一对多的关系,但是同一个类有两个外键。这是正确的方法还是应该有两个表,messages\u sent
和messages\u received
?还是别的什么?任何指向正确方向的指示都将不胜感激
编辑:为了澄清,我正在寻找一个好的数据库设计模式来解决这个问题。如果有人能帮助炼金术,那将是伟大的,但决不是必要的 但是
from_id
-列将是发送方的用户id,to_id
将是接收方的用户id
没错
您的代码示例不完整 我试图在这篇文章中省略不必要的代码,似乎我做得太过分了。以下是缺失的定义
class PM(object):
def __init__(self, from_id, to_id, message):
self.from_id = from_id
self.to_id = to_id
self.message = message
self.sent_at = datetime.utcnow()
session.mapper(PM, pm_table)
class User(object):
def __init__(self, username, pwsalt, pwhash, email):
self.username = username
self.pwsalt = pwsalt
self.pwhash = pwhash
self.email = email
self.since = datetime.utcnow()
self.status = 0
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('username', String(20)),
Column('pwsalt', String(32)),
Column('pwhash', String(64)),
Column('email', String(320)),
Column('since', DateTime),
Column('status', SmallInteger)
)
我不知道如何使用您正在使用的程序或语言,但我可以给出一些关于使用两个DBs和一个DBs的提示 您应该只为消息使用一个DB。发送的消息与接收的消息完全相同。我不明白你所说的两个外键是什么意思(我的英语不是很好),但是“from_id”列将是发送者的用户id,“to_id”将是接收者的用户id
还有一些列是明智的,包括发送者和接收者的“删除”列和接收者的“读取”列。我不知道如何使用您正在使用的程序或语言,但我可以给出一些关于使用两个数据库与使用一个数据库的提示 您应该只为消息使用一个DB。发送的消息与接收的消息完全相同。我不明白你所说的两个外键是什么意思(我的英语不是很好),但是“from_id”列将是发送者的用户id,“to_id”将是接收者的用户id
还有一些列是明智的,包括发送方和接收方的“已删除”列和接收方的“已读”列。您的代码示例不完整 您省略了
user\u表
或user
类的任何定义
此外,您还省略了PM
类的定义
如果没有其他定义,很难找出错误所在。您的代码示例不完整 您省略了
user\u表
或user
类的任何定义
此外,您还省略了PM
类的定义
如果没有其他的定义,就很难找出什么是错的。我不知道这里是否接受回答我自己的问题,但我认为有一些答案总比没有好 同一个类的两个外键不起作用,因此我必须查询数据库中的用户发件箱。但至少可以通过
user.inbox
访问收件箱。下面是工作代码
class PM(object):
def __init__(self, sender_id, receiver_id, subject, message):
self.sender_id = sender_id
self.receiver_id = receiver_id
self.subject = subject
self.message = message
self.sent_at = datetime.utcnow()
self.read = False
self.deleted_sender = False
self.deleted_receiver = False
def __repr__(self):
return '' % (self.from_id, self.to_id)
def markread(self):
self.read = True
def delete(self, deleter_id):
if deleter_id == self.sender_id:
self.deleted_sender = True
else:
self.deleted_receiver = True
pm_table = Table('personal_message', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('sender_id', Integer),
Column('receiver_id', Integer, ForeignKey('user.id')),
Column('subject', Text),
Column('message', Text),
Column('read', Boolean),
Column('deleted_sender', Boolean),
Column('deleted_receiver', Boolean),
Column('sent_at', DateTime)
)
class User(object):
def __init__(self, username, pwsalt, pwhash, email):
self.username = username
self.pwsalt = pwsalt
self.pwhash = pwhash
self.email = email
self.since = datetime.utcnow()
self.status = 0
def __repr__(self):
return '' % (self.id, self.username, userstatus[self.status])
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('username', String(20)),
Column('pwsalt', String(32)),
Column('pwhash', String(64)),
Column('email', String(320)),
Column('since', DateTime),
Column('status', SmallInteger)
)
userstatus = {
0: 'user',
1: 'vip',
2: 'moderator',
3: 'admin'
}
session.mapper(User, user_table, properties={
'inbox': relation(PM)
})
session.mapper(PM, pm_table)
类PM(对象):
定义初始化(自我、发送者id、接收者id、主题、消息):
self.sender\u id=sender\u id
self.receiver\u id=receiver\u id
self.subject=主语
self.message=消息
self.sent_at=datetime.utcnow()
self.read=False
self.deleted_sender=False
self.deleted_receiver=False
定义报告(自我):
返回“”%(self.from\u id,self.to\u id)
def markread(self):
self.read=True
def delete(自我,删除者id):
如果deleter\u id==self.sender\u id:
self.deleted_sender=True
其他:
self.deleted_receiver=True
pm_table=表(“个人_消息”、元数据、,
列('id',整数,主键=True,自动递增=True),
列('sender_id',整数),
列('receiver_id',Integer,ForeignKey('user.id'),
列(“主题”,文本),
列(“消息”,文本),
列('read',布尔),
列('deleted_sender',布尔值),
列('deleted_receiver',布尔值),
列('发送时间',日期时间)
)
类用户(对象):
定义初始化(self、用户名、pwsalt、pwhash、电子邮件):
self.username=用户名
self.pwsalt=pwsalt
self.pwhash=pwhash
self.email=电子邮件
self.since=datetime.utcnow()
self.status=0
定义报告(自我):
返回“”%(self.id、self.username、userstatus[self.status])
user\u table=表('user',元数据,
列('id',整数,主键=True,自动递增=True),
列('username',字符串(20)),
列('pwsalt',字符串(32)),
列('pwhash',字符串(64)),
列('email',字符串(320)),
列(“自”,日期时间),
列('status',SmallInteger)
)
用户状态={
0:'用户',
1:‘贵宾’,
2:‘主持人’,
3:‘管理员’
}
session.mapper(用户、用户表、属性={
“收件箱”:关系(PM)
})
会话映射器(PM,PM_表)
我不知道这里是否接受回答我自己的问题,但我觉得有答案总比没有好 同一个类的两个外键不起作用,因此我必须查询数据库中的用户发件箱。但至少可以通过
user.inbox
访问收件箱。下面是工作代码
class PM(object):
def __init__(self, sender_id, receiver_id, subject, message):
self.sender_id = sender_id
self.receiver_id = receiver_id
self.subject = subject
self.message = message
self.sent_at = datetime.utcnow()
self.read = False
self.deleted_sender = False
self.deleted_receiver = False
def __repr__(self):
return '' % (self.from_id, self.to_id)
def markread(self):
self.read = True
def delete(self, deleter_id):
if deleter_id == self.sender_id:
self.deleted_sender = True
else:
self.deleted_receiver = True
pm_table = Table('personal_message', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('sender_id', Integer),
Column('receiver_id', Integer, ForeignKey('user.id')),
Column('subject', Text),
Column('message', Text),
Column('read', Boolean),
Column('deleted_sender', Boolean),
Column('deleted_receiver', Boolean),
Column('sent_at', DateTime)
)
class User(object):
def __init__(self, username, pwsalt, pwhash, email):
self.username = username
self.pwsalt = pwsalt
self.pwhash = pwhash
self.email = email
self.since = datetime.utcnow()
self.status = 0
def __repr__(self):
return '' % (self.id, self.username, userstatus[self.status])
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True, autoincrement=True),
Column('username', String(20)),
Column('pwsalt', String(32)),
Column('pwhash', String(64)),
Column('email', String(320)),
Column('since', DateTime),
Column('status', SmallInteger)
)
userstatus = {
0: 'user',
1: 'vip',
2: 'moderator',
3: 'admin'
}
session.mapper(User, user_table, properties={
'inbox': relation(PM)
})
session.mapper(PM, pm_table)
类PM(对象):
定义初始化(自我、发送者id、接收者id、主题、消息):
self.sender\u id=sender\u id
self.receiver\u id=receiver\u id
self.subject=主语
self.message=消息
self.sent_at=datetime.utcnow()
self.read=False