我是否在使用此数据库设计的正确轨道?

时间:2012-11-27 19:43:03

标签: database database-design relational-database database-schema

我有一个我已经设置的设计,我可以真正使用一些帮助,看看我是否在正确的轨道上。如果这不是Stackoverflow的合适问题,我道歉并将删除它。我是一个相当新的用户而不是100%肯定。

我正在构建一个内容管理器,一切都是从数据库中动态传递的。我有一个包含部分的页面,这些部分包含字段,数据输入到这些字段中。字段可以是文本框,组合框或列表框。这里的要点是能够创建页面,这些页面根据节类型获得包含字段的相应部分,我只想存储这些值,以便以后可以读取或编辑页面。

第1页

SECTION1

field1 [Texbox1]
field2 [Texbox2]
field3 [Combobox1]

第2节

field1 [Texbox1]
field2 [Listbox1]
field3 [Combobox1]

这些部分可以在不同的页面上重复使用,每个部分的字段总是相同的。

我的数据库如下所示:


* PageId
* PageName

Page_Section
* PageId
* SectionId


* SectionId
* SectionTypeId
* SectionName

SectionType
* SectionTypeId
* SectionTypeName

字段
* FieldId
* SectionId
* FieldName

fieldValue方法
* FieldValueId
* FieldId
* FieldValueValue
*当前值(这有点因为组合框可能有多个值,但我想显示哪一个被选中。同样,列表框可​​以选择多个值)
* PageId

因此,使用基于节类型的节创建页面。每个部分都有x个字段,然后显然每个页面字段可以有不同的值,这就是FieldValue具有pageId的原因,但是在FieldValue中放入该pageId感觉很奇怪,但我没有别的办法。我是在正确的轨道上吗?

3 个答案:

答案 0 :(得分:2)

我认为你处于正确的一般轨道上。

我担心的一个方面是每个页面上的部分顺序 - 我认为你的Page_Section表需要一个额外的列SeqNo SMALLINT NOT NULL,它按递增的顺序取值(它们不必是连续的),因此,当您通过SeqNo订购时,您的部分将以正确的顺序显示在页面上。

对于某个部分中的字段,您可能需要一个类似的测序列。

您的Field表可能需要一些字段类型信息。

也许你的FieldValue表应该重命名为PageFieldValue;它旨在将值与特定页面上的字段相关联。只要给定字段在页面上不能出现多次,就可以准确地命名重命名的表;它包含指定页面上字段的值。目前尚不清楚是否存在某种默认系统,以便如果页面没有为字段指定特定值,则默认值会启动。可能值得考虑。

答案 1 :(得分:1)

我的大问题是,你要记录的是什么?是否要将字段的分配记录到页面的节和节?或者是由于屏幕尺寸的限制等原因,记录恰好分布在多个部分和页面上的业务数据?

例如,假设在第1页我们有客户名称和地址,在第2页我们有帐号和电话号码。如果明天有人要重新设计屏幕以将帐号移到第1页,那么您当前的数据库将需要主要数据更新来将帐号的所有字段记录从第2页移到第1页。如果这对您想要的任何内容都很重要如果你想查询“让我得到第3页上所有字段的列表”,那么就是这样,那就是这样,你的设计就是好的。但是,如果字段与页面的关联只是一个巧合的事实,而不是你在查询中会关心的东西,那么你就是朝着错误的方向前进。如果是这种情况,我会忽略关于页面和部分的所有内容,而是考虑您正在收集数据的业务对象,例如客户,商店和产品或其他任何内容。

也就是说,这是一个“屏幕布局数据库”,还是“客户信息数据库”或“产品数据库”或其他一些?如果它是一个屏幕布局数据库,那么你就是在正确的轨道上。如果它是一个产品数据库,那么你就走错了路。

答案 2 :(得分:0)

根据应用程序的不同,如果某个部分具有固定字段且经常被访问,则可以对该部分执行非规范化以提高查询性能。在某种程度上,您可以创建表section_x:

section_x
field_1
field_2
...
field_n

您可以在此Wiki页面上找到有关非规范化的更多信息:https://en.wikipedia.org/wiki/Denormalization