当我想存储这些数据时,应该如何构建我的数据库?

时间:2017-04-18 20:37:50

标签: mysql database-design

我想构建如下所示的页面,并且应该从数据库中检索所有数据。从数据库中检索术语,主语和句子。三个级别的数据。在每个术语(例如2017年春季)下,我可以在所有这些句子中进行选择。

2017年春季

Subject1

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

Subject2

  • 第13句
  • 第12句
  • 第17句

Subject3

  • 第11句
  • 第14句
  • 第19句

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       |

注意:术语数量可以多于一年中的两个。 这是您推荐的这种结构中的任何一种,还是您认为我应该构建数据库的任何其他方式?其中一个更有效吗?不是那么苛刻?更容易调整?

4 个答案:

答案 0 :(得分:3)

您正在进行关系分析/设计:

  1. 查找域名的所有实体/名词。这些是桌子的候选人。
  2. 找出这些实质内容之间的任何关系/关联。 "","由","属于","取决于"等等。将它们分为1:1,1:n,n:m关联。
    • 仔细观察1:1,并检查是否可以将原来的两张桌子缩小为一张。
    • 1:n引导您到其中一个表中的外键。
    • n:m为您提供额外的关联表,可能还有自己的属性。
  3. 关于它。我强烈建议不要在此时针对速度或空间进行优化。任何调制解调器RDBMS都会对您在示例中可能遇到的行数完全无动于衷。所有与数据库相关的软件(ORM等)都期望这样一个干净的模型。将id打包到逗号分隔的字段是绝对禁止的,因为它会破坏你的RDBMS处理这些数据的所有机制;它使应用程序更难编程;它混淆了GUI等等。

    在您的表设置中做出奇怪的选择,以便它们偏离域的干净模型是导致问题的首要原因。如果实际遇到麻烦,您可以稍后优化性能。除极端情况(巨大的数据集或吞吐量)外,此类优化主要发生在RDBMS内部(索引,存储参数,缓冲区管理等)或优化查询,而不是通过更改表。

答案 1 :(得分:1)

如果数据是分层的,请考虑使用单个表来表示数据,其中一列引用"条目类型"的简单查找。

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    |

答案 2 :(得分: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
...

答案 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)
  )