2012-04-03 35 views
7

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ùngsự 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đồ 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?

+0

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

+0

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

+0

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

Trả lời

5

Tôi khuyên bạn nên vẽ Sơ đồ mối quan hệ thực thể, sẽ rõ ràng hơn cho mọi người và bạn hiểu câu hỏi của mình.

Để trả lời câu hỏi của bạn:

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 sử dụng)

Để có được tất cả các bức ảnh của một sự kiện, bạn có thể hãy thử

session.query(Shots).filter_by(event_id=event_id) 

Event_id là id của sự kiện bạn muốn truy vấn. Để lưu trữ bởi người dùng, bạn có thể thử

from sqlalchemy.sql.expression import desc, asc 
session.query(Shots) \ 
    .filter_by(event_id=event_id) \ 
    .order_by(asc(Shots.user_id)) 

Tất nhiên, bạn có thể sắp xếp theo thuộc tính của người dùng, bạn có thể tham gia bảng người dùng.

from sqlalchemy.sql.expression import desc, asc 
session.query(Shots) \ 
    .filter_by(event_id=event_id) \ 
    .join(User) \ 
    .order_by(asc(User.name)) 

đủ dễ 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)

Cũng giống như ví dụ trước

Số mũi chích ngừa cho mỗi sự kiện

session.query(Shots) \ 
    .filter_by(event_id=event_id) \ 
    .count() 

Tôi đã không chạy chúng, tôi chỉ viết chúng ở đây, nhưng chúng tất cả sẽ hoạt động nếu tôi không mắc lỗi đánh máy.

+0

Cảm ơn bạn đã trả lời. Tôi thử ngay khi về nhà. Tôi cũng đã thêm một hệ thống ERP. Và về bố cục bảng của tôi: Bạn có nghĩ rằng bảng 'ảnh' là một cách hợp lệ để ánh xạ dữ liệu với nhau, cho các truy vấn-trường hợp của tôi không? Hay tôi nên sử dụng một cách tiếp cận khác để tổ chức các bảng và các mối quan hệ? – Brutus

Các vấn đề liên quan