2

您将如何在数据库中建模这些关系?

您有一个可以包含 PageElements 的 Page 实体。

PageElement 例如可以是文章或图片。文章表显然具有除图片之外的其他成员/列。一篇文章可以有ie。“Title”、“Lead”、“Body”列都是 nvarchar 类型,而 Picture 可能有“AltText”、“Path”、“Width”、“Height”之类的内容。我喜欢它是可扩展的,谁知道我在 3 个月内可能需要什么 PageElements?所以我想我需要一个 PageElementTypes 表。

对于关系,像这样的表呢:

带有 Id 的页面,以及其他的胡言乱语。(创建日期,可见,什么不)

Pages_PageElements与 PageId 和 PageElementId。

具有 Id 和PageElementTypeId的 PageElements 以及更多的 mumbojumbo(SortOrder、Visibility 等)。

具有 Id 和名称的PageElementTypes(例如“文章”、“图片”、“地址块”)

现在,我应该在每个 Articles、Pictures、AddressBlocks 表中创建一个 PageElementId 列来完成吗?这就是我有点卡住的地方,这是一个简单的 1:1 关系,所以这应该可以工作,但不知何故我可能会错过一些东西。

跟进:

下面推荐的具有单独属性的解决方案将迫使我将所有属性存储为同一类型,或者不是?如果一个 PageElement 的属性是 nvarchar(255) 并且有些是 nvarchar(1000),如果有些是整数怎么办?

如果我采用 EAV 方式,我将不得不创建大量表来保存所有不同数据类型的属性值。

4

5 回答 5

2

两个常见的选择是Single Table InheritanceMulti Table Inheritance。其他方法包括为每个我从未使用过的具体类创建表,以及我称之为元表实现的方法,其中属性定义被移动到数据中,而不是任何类型的模式中。

我在STI方面总体上有很好的经验,如果您不期望有过多的类和属性,这是最简单的解决方案。简单在我的书中非常好。

除非用户需要在运行时创建新的页面元素类型,否则我会避免使用元表方法和任何看起来像它的东西。根据我的经验,与开发人员定期更新的更具体的实现相比,这样的代码很快就会变成一个泥潭,并且很少能提供太多价值。

于 2008-12-02T10:10:21.210 回答
1

正如您已配置页面元素一样,您需要配置与页面元素关联的属性。

所以我们有两个项目是可扩展的页面元素及其属性。

我建议以下表格:

页面:页面 ID | ...

页面元素:页面元素 ID | 元素类型 ID | 页面编号 | ...

页面元素类型:元素类型 ID | 页面元素类型标签

页面元素属性类型:属性类型 ID | 元素类型 ID | 属性标签

页面元素属性:页面元素 ID | 属性类型 ID | 属性值

页面元素属性类型表将包含与元素关联的属性列表。例子 :

属性类型 ID 1 | 文章 | “标题”

属性类型 ID 2 | 文章 | “带领”

属性类型 ID 3 | 图片 | “替代文本”

页面元素属性表将存储与页面元素关联的属性的实际值。例子 :

页面元素 ID 1 | 属性类型 ID 1 | “大家都爱雷蒙德”

页面元素 ID 2 | 属性类型 ID 3 | “世界地图”

于 2008-12-02T09:52:29.700 回答
0

通用的解决方案是:

PageElementType: ID, Name, [Mumbo Jumbo]
PageElementTypeParameter: ID, PageElementTypeID, [Mumbo Jumbo]
Page: ID, [Mumbo Jumbo]
PageElement: ID, PageElementTypeID, [Mumbo Jumbo]
PageElementParameters: ID, PageElementID, PageElementTypeParameterID, Value, [Mumbo Jumbo]

用人类的话来说:有一个页面元素类型表和一个关联表,其中列出了每个页面元素的可能参数(例如图像的 SRC 和 ALT;文章的 TEXT 等)。

然后是一个包含所有页面的表格;列出每个页面中的元素的关联表;以及列出每个元素的参数值的表格。

于 2008-12-02T09:24:40.130 回答
0

我使用与您不同的命名约定,但这基本上是我会做的:

PageElementType(PageElementTypeID, PageElementTypeName)

PageElement(PageElementID, PageElementTypeID)

文章(ArticleID,PageElementID,...)

图片(PictureID, PageElementID, ...)

页面(页面 ID,...)

PageHasPageElement(PageHasPageElementID, PageID, PageElementID) => {PageID, PageElementID} 是唯一的

这是我所做的,似乎已经很好地标准化并且表现良好。

于 2008-12-02T09:24:41.817 回答
0

我想我会选择我所得到的,EAV 对我来说是没有选择的。我现在得到的是一种有点混合的方法。

于 2008-12-02T12:23:43.530 回答