Performance

數據庫設計建議

  • March 7, 2021
  • 上下文

    • 老師給學生製造問題

    • 問題有數字(問題)

    • 一個數字(問題)有步驟來引導學生回答

    • 選擇表示更適合的數學抽像類型

      • 求解:(未知變數,起始表達式)
      • 簡化:(參考,目標)
      • 繪圖:(斜率,b)
  • 基本模型和關係

    • 問題:一對多數字(問題)
    • 數字:零到多步
    • 腳步:
  • 要求

    • 數字和步數現在有一個如上所述的選擇,目前只有 3 個選擇,但預計會增加。只有一個和至少一個選擇
    • 根據選擇,數字或步驟將添加新屬性
    • 目前選擇之間沒有任何關係
    • 數字中的選擇可能與步驟中的選擇不同,反之亦然(參見範例)
  • 範例:盡我所能做一個緊密的抽象來展示這個想法,我製作了一個JSON結構,幾乎與我前端使用的結構相同。也許這個例子有點愚蠢,但它給人一種味道。

  • 我的嘗試:為簡單起見,模型顯示的屬性最少

    • 第一個: 第一個設計-我對這種方法的關注是數字和步驟模型中的 FK 數量。由於只有一個選擇是可能的,我將有**選擇 -**每條記錄的無用列數量

    • 第二: 第二設計-我正在以程式方式檢查數字或步驟中的選擇欄位,然後使用正確的表來填充數據,第二次嘗試開始作為解決第一種方法中的空列的解決方案

  • 我對這種方法的擔憂是表格的數量將增長 2*n,因為對於每個選擇,我需要為步驟或數字創建相應的表格

我願意接受有關此嘗試的建議或想法。

編輯:感謝@JD提出這個想法。我做了一些修改,因為我需要在某處跟踪***選擇及其欄位。***我認為這個解決方案更容易維護,並且在有新選擇的情況下無需添加表格

  • 第三: 第三設計

正如 Colin 所提到的,僅憑一般性很難理解您要解決的架構問題。不幸的是,這種事情的細節是魔鬼,因為一個細節可能會徹底改變最好的方法。

從高層次上查看您的數據庫圖表,表A,BC第一個圖表中的表在其用途方面看起來像同一個實體,但它們的列的值不同,很可能?…比較表時ANumeral相同BNumeralCNumeral到彼此,或者在您的第二張圖中比較AStepBStepCStep彼此時。問題是為什麼這些表中的每一個都不能只是一個表(或者甚至可能完全是一個表)?…例如,您可能只有一個連接到的StepAttributes表。Step

我確實注意到在您的範例中,同一組的兩個表之間的唯一區別是屬性數據類型。如果這是您製作多個表的原因,那麼只需建構您的單個屬性表(例如StepAttribute)以說明可以通過兩種方式完成的內容。

第一種方法是擁有三列,一個是AttributeName,下一個是AttributeValue(將是字元串類型欄位,如 VARCHAR,以容納任何值),第三個是AttributeDataType儲存屬性的本機數據類型,因此您知道在消費時將其適當地投射到什麼上。

第二種方法是您可以擁有一個非規範化屬性表,該表具有每個數據類型的可為空列,具有通用列名,例如DateAttributeValue,IntAttributeValueVarCharAtrributeValue,以及用於指定值是哪個數據類型 / 列儲存的列。一些系統甚至設計這樣的表,如DateAttributeValue1, DateAttributeValue2, DateAttributeValue3, IntAttributeValue1,IntAttributeValue2等,這樣它們就可以支持在同一行中儲存多個屬性。


感謝您更新您的問題並提供更多詳細資訊。Numeral因此,至少在您的第二個設計中, vs的每個子表看起來Step都有些多餘,我理解您為什麼根據您的第一個設計將它們標準化。不過,您實際上可以結合兩全其美,只需將一個Plot,SimplifySolve表與這些表中的外鍵引用欄位返回到您的表NumeralStep表,方法是將兩個 ID 儲存在該列中並將其命名為NuneralOrStepId. 然後,您需要在這些表上添加一個名為 likeIsForNumeralParentType(想出一個比我更好的名字,哈哈)這將區分它連接回哪個基表。這樣您就不會在田間浪費,也可以減少冗餘。

這取決於您預計必須生成和管理多少個子表(現在 3 個是完全可以管理的),但如果您認為這將增長到超過 10 個表左右,我仍然會考慮我的第一個建議AttributeName/AttributeValue對的通用表。您可以向此結構添加任何其他有意義的ParentType列,例如用於區分其Attribute所屬父表的列。

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