Database design 数据库中的个人消息系统

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'

我是数据库新手,想知道如何在数据库中最好地存储个人消息(使用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', 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