Tôi đã bị lỗi trong SQL và hoàn toàn mới đối với SQL Alchemy, nhưng có một dự án sắp tới sử dụng cả hai. Vì vậy, tôi nghĩ rằng tôi viết một cái gì đó để có được thoải mái. Đau khổ vì nôn nao, tôi quyết định viết một cái gì đó để theo dõi nồng độ cồn.Làm cách nào để mô hình hóa mối quan hệ nhiều-nhiều hơn 3 bảng trong SQLAlchemy (ORM)?
Tôi có events
nơi users
tham gia và tiêu thụ drinks
. Đó là ba bảng cơ bản của tôi (với một bảng trợ giúp guestlist
, cho mối quan hệ m: n giữa người dùng và sự kiện).
đồ uống danh sách các loại đồ uống có sẵn tại tất cả các sự kiện cho tất cả người dùng tất cả các thời gian (không cần phải lập bản đồ bất cứ điều gì). người dùng được tạo theo thời gian, do đó, sự kiện. tất cả người dùng có thể tham gia tất cả các sự kiện , vì vậy tôi sử dụng bảng guestlist
để ánh xạ những sự kiện đó.
Bây giờ đến trung tâm của câu hỏi: Tôi cần theo dõi thời gian người dùng tiêu thụ loại thức uống nào trên sự kiện nào. Tôi cố gắng giải quyết điều này whit một bảng khác shots
(xem bên dưới) nhưng tôi không chắc chắn nếu điều này là một giải pháp tốt.
ERP Diagram http://s1.anyimg.com/img/g6ld1ku/Bildschirmfoto.png
Trong SQL Alchemy nó có thể trông hơi như thế này (hay không, nhưng đây là những gì tôi đã đưa ra cho đến nay) ::
guestlist_table = Table('guestlist', Base.metadata,
Column('event_id', Integer, ForeignKey('events.id')),
Column('user_id', Integer, ForeignKey('users.id'))
)
class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True)
name = Column(String(80), nullable=False)
started = Column(DateTime, nullable=False, index=True,
default=datetime.datetime.now
)
users = relationship("User", secondary=guestlist_table, backref="events")
# ...
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False, unique=True, index=True)
birthdate = Column(Date, nullable=False)
weight = Column(Integer, nullable=False)
sex = Column(Boolean, nullable=False)
# ...
class Drink(Base):
__tablename__ = 'drinks'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
volume = Column(Numeric(5,2), nullable=False)
percent = Column(Numeric(5,2), nullable=False)
# ...
class Shots(Base):
__tablename__ = 'shots'
id = Column(Integer, primary_key=True)
at = Column(DateTime, nullable=False,
default=datetime.datetime.now
)
user_id = Column(Integer, ForeignKey('users.id'), index=True)
event_id = Column(Integer, ForeignKey('events.id'), index=True)
drink_id = Column(Integer, ForeignKey('drinks.id'))
user = relationship("User", backref="shots")
event = relationship("Event", backref="shots")
drink = relationship("Drink", uselist=False) # one-to-one, no backref needed
tôi đấu tranh để tìm ra cách tốt để xây dựng một bảng mà các bản đồ sự kiện, người dùng và đồ uống với nhau: làm thế nào tôi nên xây dựng các relationships và làm cách nào để query nó?
Điều tôi cảm thấy mình đã bỏ qua điều gì đó. Và thẳng thắn, tôi hoàn toàn bị mất về cách truy vấn nó?
Dưới đây là các truy vấn tôi sẽ làm hầu hết thời gian:
- tôi ít nhất cần phải có được tất cả các mũi chích ngừa tiêu thụ trên một sự kiện (có thể được sắp xếp theo người dùng)
- Tôi cũng đôi khi cần tất cả các bức ảnh cho một người dùng cụ thể (có thể được sắp xếp theo sự kiện)
- Và rất nhiều đếm:
- số mũi chích ngừa cho mỗi sự kiện
- số mũi chích ngừa cho mỗi u ser
- Số bức ảnh một người dùng bị bắn rơi tại một sự kiện
là bảng shots
một cách không quan trọng để quản lý này?
Xin chào @Brutus, Theo quan điểm của tôi, mối quan hệ của bạn giống như 1 người dùng có thể tham gia nhiều sự kiện và 1 sự kiện có nhiều người dùng (danh sách khách mời). 1 sự kiện có nhiều đồ uống và 1 đồ uống có thể phục vụ trong nhiều sự kiện (danh sách đồ uống). 1 người dùng có thể uống nhiều đồ uống và 1 đồ uống có thể phục vụ cho nhiều người dùng (guestdrinklist). Điều này có đúng không? – Nilesh
Tất cả đồ uống đều có sẵn ở tất cả các sự kiện, vì vậy tôi nghĩ tôi có thể không cần 'drinklist'. Những gì bạn gọi là 'guestdrinklist' tôi đã cố gắng để mô hình trong lớp' Shots'. Nó sẽ là tốt hơn để chia lớp trong hai bảng? – Brutus
Nếu tất cả đồ uống có sẵn ở tất cả các sự kiện thì không cần phải xác định mối quan hệ giữa đồ uống và sự kiện.Bạn phải xác định mối quan hệ nếu tập con của trường của bạn được liên kết với thực thể khác nếu tất cả được liên kết thì không có mối quan hệ cần thiết. Bạn có thể tạo mối quan hệ giữa đồ uống và người dùng. – Nilesh