是否可以将表示数据存储在数据库中


Is it ok to store presentation data in the database?

我要在网页中显示数据库(SQL SERVER 2005)表中的行。这些行包含statusID(外键),由状态表进一步定义。id, name, modifiedDate).

不同的状态应该以不同的方式显示(假设它们只是有不同的背景颜色)。

我使用php查询数据库,并建立网页表。在构建表时,我将根据该行的状态对元素应用css类。

我至少有两个选项来做这件事:

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

  2. 将"类"存储在数据库中,并简单地应用已存储的类

后一个选项对我来说似乎更好,但我不确定将表示数据嵌入到数据库中是否是一个糟糕的设计选择。这将是我创建几个内部网实用程序的基础,我想从正确的角度开始。

在数据库中存储任何数据都没有问题,包括表示数据。如果它可以帮助您产生有效的结果,同时编写更少的代码,那么它就是一个很好的实践。您需要确保的是不要将表示逻辑数据库逻辑混合在一起。

您可以通过将表示层的数据封装在elementInfo对象(例如)的属性中来确保这些关注点是分开的。

因为它是一个CSS类,这个表示数据应该与业务数据分开。因此,虽然在数据库中存储表示数据和业务数据是可以的,但将它们存储在同一个表中是不可接受的。

Update re: comment不,您不应该在业务对象上添加PresentationClassRecord的Id作为FK。我在下面做了一个数据库方法的示例。我将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

现在,通过两个简单的连接子句,您可以获得表示数据,并且它与业务数据完全解耦。您的脚本可以做一些事情,比如检查Dummy的状态是否有任何演示任务。如果是这样,那么它将查看PresentationType,获取适当的函数来将表示数据应用到表示中,并执行它。(您需要为每个PresentationType提供一个函数,该函数知道如何处理该值—可以由function applyPresentationValue(presentationElement, presentationType, presentationValue)之类的东西封装,如果presentationType == "CssClass"调用不同的函数applyCssClass(presentationElement, value))。

类本身并不是真正的表示数据。它只是每一种状态的标签。从理论上讲,除了决定在网页上显示的状态应该是什么颜色之外,你还可以用它做很多事情。

当您将该类与一组给定的样式组合在一起时,是表示信息。你将在你的CSS文件中做这些,而不是在数据库中。

但是,如果数据库中的状态发生变化,选项1不一定要求您更改PHP代码。PHP可以从状态的idname生成类名。如果状态的id/名称改变了,你的CSS也必须改变,但这可能吗?如果应用程序需要表示的状态发生了变化,那么每个状态不应该保持不变,并添加新状态吗?

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

。状态=打开,关闭使用PHP逻辑生成表行,并将CSS类设置为status_{name}然后,任何时候你添加一个新的状态或重命名它,你只需要添加/编辑CSS文件,不需要PHP重新编码。

.status_open{background-color:green;}

.status_closed{background-color:red;}

我看到了将其存储在DB中的优点和缺点。显然,将类信息放在那里很方便,但它并不是应用程序的真正组成部分。

我倾向于不把它存储在那里,在表示层做一些事情来根据状态处理它。我的理由是,特别是因为您正在创建实用程序,数据可能会通过API或以后类毫无意义的地方使用。