2017-04-18 82 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内部(索引,存储参数,缓冲区管理等)或优化查询,而不是通过更改表格。

相关问题