将演示数据存储在数据库中是否可以接受?

8

我需要在网页上显示来自数据库 (SQL SERVER 2005) 表格的行。这些行包含一个状态 ID(外键),该 ID 又由 Status 表格进一步定义(例如:id、name、modifiedDate)。

不同的状态应该显示不同(比如说,它们只是有不同的背景颜色)。

我使用 PHP 查询数据库,并构建网页表格。在构建表格时,我将根据每行的状态向元素应用 CSS 类。

我至少有两种方法可以做到这一点:

  1. 在 PHP 中定义代码逻辑来处理它,如果在数据库中更改状态,我将不得不改变代码。

  2. 将“class”存储在数据库中,然后简单地应用已存储的类。

后一种选项似乎更好,但我不确定将表示数据嵌入到数据库中是否是一个糟糕的设计选择。这将成为我创建几个内部实用程序的基础,并且我想从正确的方向开始。


我猜你所说的“应用CSS类”是指应用一个类属性? ;) - Richard JP Le Guen
1
约定优于配置?我会为状态表中的每个记录创建一个“status_<status_name>”CSS类...只需应用一些标准字符串修改来删除不适合作为CSS类名的空格和其他字符。 - Schwartzie
1
你是否考虑添加许多不同的状态?如果您允许用户自定义状态及其外观,则不会存储类信息,因为他们无法添加类。您可能会存储特定的可自定义选项,例如背景颜色或字体颜色。通常状态是明确定义的,不应该经常更改。一个简单的函数,如GetStatusClass(statusValue),返回适当的类别,不应该经常更改。 - Prescott
@Richard 是的,“类属性”。 - LittleTreeX
@Prescott - 很好的观点。虽然我不认为状态会有太大变化,但这个原则将应用于应用程序的其他部分,这只是一个例子。整个事情还处于非常早期阶段,最初状态可能会发生根本性的变化。 - LittleTreeX
@LittleTreeX - 我认为你需要问问自己将要添加/删除多少值。如果它们经常变化,你是为它们创建一个新的CSS类吗?还是有预定义的CSS类可以分配。如果你必须创建一个CSS类,我认为你最好使用一个函数来映射值到CSS - 因为你必须 anyway触摸代码。 - Prescott
4个回答

4
在数据库中存储任何数据都没问题,包括展示数据。如果这能帮助你更有效地编写少量代码并产生良好的结果,那么这是一种好的实践。你需要确保的是不要混淆展示逻辑数据库逻辑
你可以通过将展示层的数据封装在elementInfo对象的属性中来分离这些问题。
由于你谈论的是CSS类,这个展示数据应该与业务数据分开。因此,虽然在数据库中存储展示数据和业务数据都可以,但在同一个表中存储它们是不可接受的。
关于评论的更新:不,你不应该在业务对象上添加PresentationClassRecord的Id作为外键。下面是我制作的一个数据库方法的示例。我将DummyTable称为你的业务对象,其余遵循规范。最相关的部分是StatusPresentationAssignmentTable
 -----------------------------------------------
 DummyTable
 -----------------------------------------------
 Id      Name     SomeOtherDataField    StatusId
 PK int  varchar  int                   FK int

 -----------------------------------------------
 StatusTable
 -----------------------------------------------
 Id      Name     ModifiedDate
 PK int  varchar  datetime

 -----------------------------------------------
 PresentationTable
 -----------------------------------------------
 Id      PresentationType    Value 
 PK int  varchar            
 sample data:
 43      CssClass            prettyBackground

 -----------------------------------------------
 StatusPresentationAssignmentTable
 -----------------------------------------------
 StatusId    PresentationId 
 FK int      FK int

现在只需两个简单的连接子句,您就可以获取演示数据,并且它与您的业务数据完全解耦。 您的脚本可以执行一些操作,例如检查虚拟对象的状态是否有任何演示分配。 如果是,则查看PresentationType,获取适当的函数将演示数据应用于演示,并执行它。 (您需要为每个PresentationType编写一个函数,该函数知道如何处理该值-可以通过类似function applyPresentationValue(presentationElement,presentationType,presentationValue)的封装来实现,如果 presentationType ==“CssClass” ,则调用不同的函数applyCssClass(presentationElement,value))。

另加一列并将其链接到“演示文稿”表,是否可以创建这种分层结构? - LittleTreeX
我喜欢这个例子。然而,在这种特殊情况下,如果我在整个应用程序中应用这种思想,那么会创建许多额外的小分配表。我应该关心这个问题吗?连接和额外的表是否会降低性能? - LittleTreeX

4
这个类本身并不是呈现数据,只是每种状态的标签。理论上,您可以将其用于除了在网页上显示状态时决定颜色之外的许多其他事情。
当您将该类与给定的样式组合使用时,它就是呈现信息。而这是在CSS文件中完成的,而不是在数据库中。
然而,如果数据库中的状态发生更改,选项1并不一定需要您更改PHP代码。您的PHP可以根据状态的id或名称生成类名。如果状态的id/名称更改,您的CSS将需要更改,但这可能吗?每个状态都应该保持不变,并添加新状态,如果应用程序需要表示状态,则进行更改。

3

虽然你可以将css类信息存储在数据库中,许多内容管理系统都这样做,但最好将状态作为类名的一部分。

例如: 状态 = 开放,关闭 使用php逻辑生成表行并将css类设置为status_{name}, 然后每当您添加新状态或重命名时,只需添加/编辑css文件,无需进行php重新编码。

.status_open{background-color:green;}

.status_closed{background-color:red;}


1

我认为将其存储在数据库中有优点和缺点。显然,在那里拥有类信息很方便,但它并不是应用程序的真正部分。

我倾向于不将其存储在数据库中,并在表示层中根据状态处理它。我的理由是,特别是因为您正在创建实用程序,数据可能稍后通过API或其他方式使用,而类是无意义的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接