2011-04-28 177 views
8

我想显示来自网页中的数据库(SQL SERVER 2005)表的行。这些行包含status状态表(例如id,name,modifiedDate)进一步定义的statusID(外键)。将演示数据存储在数据库中可以吗?

各种状态应显示不同(让他们说,他们只是有不同的背景颜色)。

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

我至少有2个选项来做到这一点:

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

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

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

+0

我把它的 “应用CSS类” 你的意思是应用类_attribute_? ;) – 2011-04-28 17:43:21

+1

公约可以配置吗?我只需为状态表中的每条记录创建一个“status_ ”CSS类...只需应用一些标准字符串修改即可删除不适合CSS类名称的空格和其他字符。 – Schwartzie 2011-04-28 17:45:24

+1

你是否想过要添加许多不同的状态?如果您允许用户自定义状态以及它们的外观,那么您不会存储类信息 - 因为它们不能添加类。您可能正在存储特定的自定义选项,如背景颜色或字体颜色。通常地位是明确的,不应该有太大的变化。一个简单的函数,如GetStatusClass(s​​tatusValue),返回适当的类应该不会有太大变化。 – Prescott 2011-04-28 17:47:46

回答

4

在数据库中存储任何数据(包括演示数据)没有任何问题。如果它能帮助你产生有效的结果,同时减少代码,那么这是一个好习惯。你需要确保的是你不要混合你的表示逻辑和你的数据库逻辑

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

既然是你所谈论的CSS类,这演示数据应保持在业务数据分开。因此,虽然可以将演示数据和业务数据存储在数据库中,但将它们存储在同一个表中是不可接受的。

更新重新:评论不,您不应该添加PresentationClassRecord的Id作为业务对象上的FK。我对下面的db做了一个示例。我打电话给您的业务对象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)的东西封装该函数,该函数调用不同的函数applyCssClass(presentationElement, value),如果该值为presentationType == "CssClass")。

+0

将另一列链接到“表示”表创建此图层分离? – LittleTreeX 2011-04-28 17:48:10

+0

@LittleTreeX,请参阅更新。 – smartcaveman 2011-04-28 18:04:59

+0

我喜欢这个例子。但是,在这种特殊情况下,这意味着我会创建许多额外的小型分配表(假设我在整个应用程序中应用了这种意识形态)。我是否应该关心这一点,并且通过连接和额外表格来降低性能? – LittleTreeX 2011-04-28 18:18:21

4

该类本身并不是真正的表象数据。这只是每种状态的标签。理论上,您可以将其用于许多事情,而不是决定网页上显示状态的颜色。

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

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

1

我看到存储在数据库中的优点和缺点。显然,在那里获得班级信息很方便,但它并不是应用程序的真正组成部分。

我会倾向于不把它存储在那里,并根据状态来处理表示层。我的推理是因为,尤其是因为你正在创建实用程序,所以数据可能会通过API或稍后类中毫无意义的东西使用。

3

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

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

.status_open{background-color:green;}

.status_closed{background-color:red;}

相关问题