我想构建如下所示的页面,并且应该从数据库中检索所有数据。从数据库中检索术语,主语和句子。三个级别的数据。在每个术语(例如2017年春季)下,我可以在所有这些句子中进行选择。
2017年春季
Subject1
Subject2
Subject3
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 |
注意:术语数量可以多于一年中的两个。 这是您推荐的这种结构中的任何一种,还是您认为我应该构建数据库的任何其他方式?其中一个更有效吗?不是那么苛刻?更容易调整?
答案 0 :(得分: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)
)