联结中具有唯一值的多对多关系 table
Many to Many relationships with unique values in a junction table
我一直在尝试使用 Flask 构建一个网站,但在为数据库建立合适的模型时遇到了一些问题。我正在制作一个功能类似于读书俱乐部的应用程序。
以下是模型的详细信息:
- 一个用户可以添加多本书
- 一本书可以被很多用户阅读
- 每个用户都必须为每本书添加一个(并且只有一个)状态标签(表示已读、待读或正在阅读)
我正在努力为此想出一个合适的模型。我正在使用 flask-sqlalchemy。
这是我目前的情况:
class User(db.Model):
id = db.Column(db.String, default = urlsafe_b64encode(uuid().bytes)[0:10], primary_key=True) #unique id
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(80), unique=True, nullable=False)
firstName = db.Column(db.String(20), unique=True, nullable=False)
bookstatus = db.relationship('BookStatus', backref='user', lazy=True)
date_created = db.Column(db.DateTime, default=datetime.now)
class BookStatus(db.Model):
book_id = db.Column(db.Integer, db.ForeignKey('book.id'), primary_key=True)
added_by = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
status = db.Column(db.Integer, nullable=False)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
gbook_id = db.Column(db.String(20), unique=False, nullable=False)
added_by = db.Column(db.String, db.ForeignKey('user.id'),
nullable=False)
bookstatus = db.relationship("BookStatus", backref='book', lazy=True)
有人告诉我,本书多对多关系的联结 table 应该定义为 table 而不是通过 class,但是我不确定如何包含状态列。然后我是否对 table 和 bookstatus class 使用一对一的关系?还是我完全错了!!
请帮忙!我一直在努力解决这个问题。
谢谢!
多对多关系由 BookStatus 模型和数据库中对应的 table 表示。
这是您的模型:
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.String, default = urlsafe_b64encode(uuid().bytes)[0:10], primary_key=True) #unique id
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(80), unique=True, nullable=False)
firstName = db.Column(db.String(20), unique=True, nullable=False)
date_created = db.Column(db.DateTime, default=datetime.now)
class BookStatus(db.Model):
__tablename__ = 'book_status'
book_id = db.Column(db.Integer, db.ForeignKey('book.id'), primary_key=True)
added_by = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
status = db.Column(db.Enum('read', 'to be read', 'being read'), nullable=False)
user = db.relationship('User', foreign_keys=[added_by])
book = db.relationship('Book', foreign_keys=[book_id])
class Book(db.Model):
__tablename__ = 'book'
id = db.Column(db.Integer, primary_key=True)
gbook_id = db.Column(db.String(20), unique=False, nullable=False)
我已将您的 BookStatus.status 属性更改为枚举类型。您可以使用整数,例如 0(正在读取)、1(待读取)和 2(已读取),但我认为在这种情况下使用枚举类型更好。
在 ORM(对象-关系映射)和关系数据库设计中,每个实体(对象,table)只需要 属性 即可描述该实体。例如 Book.added_by 不能,或者更准确地说不应该表示为一本书的属性。 User.book_status 的情况相同。用户不是一本书。
作为 属性 的图书状态需要是图书实体的属性(如果该状态代表图书的质量)。在您的情况下 book_status 与联结点 table(entity) - BookStatus(用户和书籍之间的多对多关系)有关。
我一直在尝试使用 Flask 构建一个网站,但在为数据库建立合适的模型时遇到了一些问题。我正在制作一个功能类似于读书俱乐部的应用程序。
以下是模型的详细信息:
- 一个用户可以添加多本书
- 一本书可以被很多用户阅读
- 每个用户都必须为每本书添加一个(并且只有一个)状态标签(表示已读、待读或正在阅读)
我正在努力为此想出一个合适的模型。我正在使用 flask-sqlalchemy。
这是我目前的情况:
class User(db.Model):
id = db.Column(db.String, default = urlsafe_b64encode(uuid().bytes)[0:10], primary_key=True) #unique id
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(80), unique=True, nullable=False)
firstName = db.Column(db.String(20), unique=True, nullable=False)
bookstatus = db.relationship('BookStatus', backref='user', lazy=True)
date_created = db.Column(db.DateTime, default=datetime.now)
class BookStatus(db.Model):
book_id = db.Column(db.Integer, db.ForeignKey('book.id'), primary_key=True)
added_by = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
status = db.Column(db.Integer, nullable=False)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
gbook_id = db.Column(db.String(20), unique=False, nullable=False)
added_by = db.Column(db.String, db.ForeignKey('user.id'),
nullable=False)
bookstatus = db.relationship("BookStatus", backref='book', lazy=True)
有人告诉我,本书多对多关系的联结 table 应该定义为 table 而不是通过 class,但是我不确定如何包含状态列。然后我是否对 table 和 bookstatus class 使用一对一的关系?还是我完全错了!!
请帮忙!我一直在努力解决这个问题。
谢谢!
多对多关系由 BookStatus 模型和数据库中对应的 table 表示。 这是您的模型:
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.String, default = urlsafe_b64encode(uuid().bytes)[0:10], primary_key=True) #unique id
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(80), unique=True, nullable=False)
firstName = db.Column(db.String(20), unique=True, nullable=False)
date_created = db.Column(db.DateTime, default=datetime.now)
class BookStatus(db.Model):
__tablename__ = 'book_status'
book_id = db.Column(db.Integer, db.ForeignKey('book.id'), primary_key=True)
added_by = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
status = db.Column(db.Enum('read', 'to be read', 'being read'), nullable=False)
user = db.relationship('User', foreign_keys=[added_by])
book = db.relationship('Book', foreign_keys=[book_id])
class Book(db.Model):
__tablename__ = 'book'
id = db.Column(db.Integer, primary_key=True)
gbook_id = db.Column(db.String(20), unique=False, nullable=False)
我已将您的 BookStatus.status 属性更改为枚举类型。您可以使用整数,例如 0(正在读取)、1(待读取)和 2(已读取),但我认为在这种情况下使用枚举类型更好。
在 ORM(对象-关系映射)和关系数据库设计中,每个实体(对象,table)只需要 属性 即可描述该实体。例如 Book.added_by 不能,或者更准确地说不应该表示为一本书的属性。 User.book_status 的情况相同。用户不是一本书。
作为 属性 的图书状态需要是图书实体的属性(如果该状态代表图书的质量)。在您的情况下 book_status 与联结点 table(entity) - BookStatus(用户和书籍之间的多对多关系)有关。