Sqlalchemy

為方便範例,拆分具有多個欄位的表

  • August 31, 2020

為了方便起見,將具有多個欄位的表拆分為兩個部分是個好主意嗎?

真實例子:

class UserData(Base):
   __tablename__ = "users_data"

       id = Column(Integer, primary_key=True, index=True)
       age = Column(Integer, index=True)
       first_name = Column(String, index=True)
       last_name = Column(String, index=True)
       country = Column(String, index=True)
       city = Column(String, index=True)
       comment = Column(String, index=True)
       users_meta = relationship("UserMeta", uselist=False, back_populates="users_data")
   
   
   class UserMeta(Base):
       __tablename__ = "users_meta"
       id = Column(Integer, primary_key=True)
       email = Column(String, unique=True, index=True)
       hashed_password = Column(String)
       created = Column(DateTime(timezone=True), server_default=func.now())
       last_visited = Column(DateTime(timezone=True))
       is_active = Column(Boolean, default=True)
       user_data_id = Column(Integer, ForeignKey('users_data.id'))
       users_data = relationship("UserData", back_populates="users_meta")

因此,在一個表中只有 id 和有關使用者的數據,第二個表是元資訊。目前我不知道我將使用多少次以及哪些欄位會比其他更多。

還有一個額外的問題是,我是否需要創建第三個表,其中包含電子郵件和 id 之間的相關性,或者我可以在沒有它的情況下做到這一點?

PS我希望數據很容易理解,沒有標準SQL格式的翻譯

您提出的設計存在幾個問題。

從最簡單的問題開始:“年齡”列。像“年齡”這樣的屬性是依賴於基礎屬性的計算值。您必須將日期儲存在數據庫中的其他位置。我建議您在 SQL 語句中計算年齡或將其設置為虛擬列。

其次,user_meta 表中的事實似乎將幾個概念混合在一起:使用者身份驗證、帳戶資訊和聯繫資訊。考慮到這種組合,我猜你每個使用者只有一行——除非你允許使用者基於電子郵件地址創建多個登錄身份。如果您有一對一的關係,為什麼要將其拆分為兩個表?如果沒有關於您的案例的更多資訊,我實際上認為您需要 5 個表:使用者身份、物理地址、電子郵件地址、帳戶活動和密碼。

您提出的架構的資訊安全性很差。密碼應單獨儲存,以便您可以限制訪問並實施其他安全措施。同樣,您可能希望限制對電子郵件地址的訪問。

所以我的建議是查看所有使用者屬性並查看邏輯分組是什麼。考慮哪些資訊集具有一對一或多對一的關係。在進行分組時考慮安全方面。

引用自:https://dba.stackexchange.com/questions/274728