2017-04-18 29 views
1

我想要構建如下所示的頁面,並且應該從數據庫中檢索所有數據。術語,主題和句子都從數據庫中檢索。三個級別的數據。在每個學期(例如2017年春季),我都可以在所有這些句子之間進行選擇。當我想要存儲這些類型的數據時,我應該如何構建我的數據庫?

彈簧2017

Subject1

  • 語句1
  • 句子2
  • 句子3

Subject2

  • 句子13
  • 句子12
  • 句子17

Subject3

  • 句子11
  • 句子14
  • 句子19

Autmn 2017年

...

我想提出類似的信息從數據庫到用戶,並讓這一切句子之間的用戶選擇。我應該如何建立我的數據庫,以最好和最有效的方式實現這一目標。

一種方法是:

Table 'subject'   Table 'sentences' 
| id | subjects |  | id | subjectid |  name  | 
| 3 | Subject1 |  | 1 |  3  | Sentence 2 | 
| 4 | Subject2 |  | 2 |  4  | Sentence 13 | 

Table 'term' 
| id |  term  |  sentenceid  | 
| 1 |  Spring 17 |  1,2,28  | 

另一種方式是,也許使用樞軸表,是這樣的:

 Table 'sentences' 
    | id | parentid |  name  | 
    | 1 |  0  | Subject2 | 
    | 2 |  3  | Sentence 2 | 
    | 3 |  0  | Subject1 | 
    | 4 |  1  | Sentence 13 | 

Table 'term' 
| id |  term  |  sentenceid  | 
| 1 |  Spring 17 |  2,4,28  | 

注意:語詞的數量可能比只有兩個更多的一年。 這是你推薦的任何這種結構,或者你認爲我應該建立我的數據庫的任何其他方式嗎?其中一個更有效率?不那麼苛刻?更容易調整?

+3

我不明白你想做什麼,但我可以告訴你,在一個字段中存儲逗號分隔值會導致痛苦和沮喪,所以我不喜歡這些選項。 – JNevill

+0

術語,主語和句子均從數據庫中檢索。三個級別的數據。在每個學期(例如2017年春季),我都可以在所有這些句子之間進行選擇。 – William82

回答

0

如果數據是分層的,可以考慮使用單個表格來表示它,其中一列引用「入口類型」的簡單查找。

Table AcademicEntry 
================================ 
| ID | EntryTypeID | ParentAcademicEntryID | Description | 
========================================================== 
| 1 | 3  | 3      | Sentence 1 | 
| 2 | 1  | <null>    | Spring 2017 | 
| 3 | 2  | 2      | Subject1 | 

Table EntryType 
================================ 
| ID | Description | 
==================== 
| 1 | Semester | 
| 2 | Subject  | 
| 3 | Sentence | 
+0

是的,如果所有這些實體只是一些字符串和位置,則分層表是一個合理的選項。然而,MySQL是相當有限的,並且它可能會使用不支持遞歸查詢的DMBS來查詢表。 –

0

以條款開始。每個學期都有科目。每個主題都有句子。那麼你可能需要在一個學期內的某個學科的位置,也可能需要一個學科在某個學科中的位置。

 
Table 'term' 

id | term 
---+------------ 
1 | Spring 2017 


Table 'subject' 

id | title | termid | pos 
---+----------+--------+---- 
3 | Subject1 | 1  | 1 
4 | Subject2 | 1  | 2 
5 | Subject3 | 1  | 3 


Table 'sentence' 

id | name  | subjectid | pos 
---+-------------+-----------+----- 
1 | Sentence 2 | 3   | 2 
2 | Sentence 13 | 4   | 1 
3 | Sentence 1 | 3   | 1 
4 | Sentence 3 | 3   | 3 
2 | Sentence 17 | 4   | 3 
... 
0

此表設計應該解決您的需求。

TblSeason 
    (
    SeasonId int, 
    SeasonName varchar(30) 
) 

    tblSubject 
    (
    Subjectid int 
    sessionid int (fk to tblsession) 
    SubjectData varchar(max) 
) 

    tblSentences 
    (
    SentencesID INT 
    Subjectid int (Fk to tblSubject) 
    SentenceData varchar(max) 
) 
3

你正在做相關的分析/設計:

  1. 查找所有實詞/域的名詞。這些是表格的候選人。
  2. 找到這些實體之間的任何關係/關聯。 「有」,「由......組成」,「屬於」,「依賴於」等。將它們分成1:1,1:n,n:m關聯。
    • 看起來很難1:1,並檢查是否可以減少兩個原始表成一個。
    • 1:n將您引向其中一個表中的外鍵。
    • n:m給你額外的關聯表,可能有它們自己的屬性。

就是這樣。我強烈建議不要在此時優化速度或空間。任何調制解調器RDBMS都會對您在示例中可能遇到的行數完全無動於衷。所有與數據庫相關的軟件(ORMs等)都期望這樣一個乾淨的模型。將逗號分隔的字段打包成ID是絕對不允許的,因爲它打敗了你的RDBMS必須處理這些數據的所有機制;它使應用程序難於編程;它混淆了GUI等。

在您的表格設置中做出奇怪的選擇,以便它們偏離您的域的乾淨模型是導致此問題的首要原因。如果您真的遇到麻煩,您可以稍後優化性能。除極端情況外(巨大的數據集或吞吐量),這種優化主要發生在RDBMS內部(索引,存儲參數,緩衝區管理等)或優化查詢,而不是通過更改表格。

相關問題