Database-Design

數據庫設計問題:帶有值(持續時間)的標籤連結到它們

  • July 27, 2019

我正在創建一個接受日常輸入的數據庫,例如:

  • 日期
  • 該日期的事件(例如項目 foo:5 小時,bar:2 小時等…)
  • 日期評分

還有更多,但這些可能是有關該問題的唯一相關輸入。問題是我如何建構我的表,以便我以某種方式儲存事件持續的特定持續時間。目前我擁有的是:

  • 儲存使用者登錄憑據的使用者表 (1)
  • 一個評級表,用於儲存輸入日期、日期評級等… (2)
  • 儲存唯一標籤的標籤表 (3)

我將使用標籤和評級來尋找未來可能的模式,以防萬一。

如果我只需要處理與特定日期相關的標籤,我一點也不覺得困難,因為我只需要有一個唯一的標籤表並將 tag_id 與日期相關聯。但我不知道如何有效地儲存標籤在特定日期的持續時間。我當然可以只使用一個表,接受不同日期重疊標籤的冗餘,並將標籤、事件和持續時間儲存在單個字元串欄位中。但這對我來說似乎沒有效率。我在數據庫方面非常新手,我很感激幫助。

我正在使用 Python 3.7.2、SQLite 和 Flask-SQLAlchemy 2.4.0 來建構表。

像這樣:

(1)

class User(db.Model):
__tablename__ = 'user'

id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(128))

(2)

class Rating(db.Model):
__tablename__ = 'rating'

id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.Date, unique=False, nullable=False)
rating_day = db.Column(db.Integer, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
# etc...

(3)

class Tags(db.Model):
__tablename__ = 'tags'

id = db.Column(db.Integer, primary_key=True)
tag = db.Column(db.Integer, unique=True, nullable=False)

微軟 SQL Server 的傢伙在這裡。不確定我是否了解您如何擷取事件,但我使用的一種方法是擷取開始時間和結束時間,然後在事後計算持續時間。如果一個人手動開始和結束一個事件,那麼這就是我的方法。至於將標籤與事件相關聯,連接表將解決單個事件上的多個標籤的問題。

/****** Object:  Table [dbo].[event_tags]  
CREATE TABLE [dbo].[event_tags](
   [id] [int] NOT NULL,
   [event_id] [int] NOT NULL, --Foreign key to table events' primary key
   [tag_id] [int] NOT NULL --Foreign key to table tags' primary key
)

主要問題似乎是

如何建構我的表格,以便我以某種方式儲存事件持續的特定持續時間

我如何有效地儲存標籤在特定日期的持續時間

John Herbet 已經建議儲存兩個時間值,然後找出差異。由於您似乎依賴 Python 和 SQLAlchemy 庫,那麼最好的方法可能是儲存兩個日期時間值。(我不是 Python 或 SQLAlchemy 方面的專家,但它看起來既有 date 又有 datetime 數據庫類型。)然後利用標準 Python 庫來查找差異,並以其他方式操縱與事件一起儲存的開始和結束時間(或標籤?)。

對於基於 SQL 查詢和 sqlite 內置函式的更以 sqlite 為中心的方法,我建議使用這個網頁,因為它有一些使用該juliandate()函式來操作日期/時間值的很好的範例。儒略日期儲存為十進制數,表示自很久以前的 epoc 以來經過的天數。方便之處在於數字的差異和數字的加法可以揭示時間跨度。如果您最終直接使用 sqlite SQL,這值得研究。


您所說的“事件”與“評級”和“標籤”之間的關係尚不清楚。主要目的似乎是記錄“事件”,但沒有“事件”表的定義!此外,問題提到了“重疊標籤”的可能性,但通常標籤通常指的是基本標籤或類別。我會重新設計該表架構以更自然地反映您要儲存的內容,或者如果該細節甚至相關,則使用更好的解釋來更新問題。

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