很久以前,我接手了一个基于网络的内容管理系统的维护,该系统里面有一个非常聪明的数据库表。
表格结构如下:
TABLE:tPage (关于PageID,版本,状态的PK)
PageID, PageTitle, Version, Status
1, Homepage, 1, Archived
1, Homepage, 2, Live
1, New Home, 3, Draft
TABLE:tElements (PageID,Version,ElementName上的PK)
PageID, Version, ElementName, ElementValue (nText)
1, 1, IntroText, Hi, this is our first version.
1, 2, IntroText, This is the current version,
1, 2, MainBody, We sell sprockets.
1, 3, IntroText, Welcome text here
1, 3, MainBody, We sell sprockets and widgets.
要获取当前主页的正文文本,您需要编写如下查询:
查询:
SELECT ElementValue
FROM tElements, tPage
WHERE PageID = 100
ElementName = 'MainBody'
AND tPage.PageID = tElements.PageID
AND tPage.Version = tElements.Version
AND tPage.Status = 'Live'
结果:
We sell sprockets.
这个表结构之美(至少对我来说)是当我想添加新类型的数据时,我不需要向表中添加新列。我刚刚创建了一个新的ElementName。但在功能上它就像一个新专栏。
我已经在其他一些项目中使用了这种安排,我需要一个随着新功能/内容类型的添加而容易改变的数据库。例如,在我上面的CMS示例中,我们从IntroText和MainBody开始,但几年之后我们最终得到了CoursePrice,ContactPerson,RelatedCourses,SetupFee,我发现这种组织数据的方式非常灵活。
我的问题是,这种类型的表结构叫什么?我不确定我应该使用Google搜索哪些关键字来获取更多信息。
答案 0 :(得分:3)
它被称为“实体 - 属性 - 值”或“EAV”。