MySQL状态模型 - 最佳实现?

时间:2009-11-12 19:10:27

标签: php mysql database-design

所以我和我的一个同事一起研究框架式系统。我们当前的挑战是如何最好地实施状态。通常情况下,状态将带有唯一数据(表行的颜色,或要显示给用户的文本等)。目前,我们有一个包含所有这些数据的状态表。该表中包含一列:“css_class”,每当记录具有该状态时,指定的CSS类将附加到该元素(在本例中为tr)。此外,为了为另一个记录分配特定状态,在该数据库表中指定了外键(在这种情况下,用户具有特定状态。因此在users表中,有一个statuses_id外键)。这个实现工作正常,但有一些问题。首先,如果记录处于特定状态,我需要在PHP中执行特定操作,该怎么办?我们现在的做法是这样的:

if($user->status==0) 
{
    //execute some code
}

如果状态可以改变,这真的不行。更改一个状态,相关代码中断或行为与预期不同。

另一个问题,以及发布问题的主要原因是该表包含“css_class”列。这是非常通用的,允许我们非常快速地改变特定状态的风格。但我们真的不喜欢将代码放入数据库的想法。也许在数据库中使用CSS类不一定是坏事,但我真的不知道常见的做法是什么。有什么想法吗?

编辑:

我从前几个答案中收集到的是,为了维护MVC框架,我应该从模型中保留所有视图内容。我的论点是,如果我将css_class名称保留在数据库之外,那么我正在检查视图中的状态id,以便决定分配它的类。因此,如果我将该类放在数据库中,我将View信息放入模型中。如果我不在数据库中放入CSS类,那么我将模型信息放在View中(检查它属于哪个ID)。因此,如果不混淆模型,我会改变观点......

3 个答案:

答案 0 :(得分:2)

到目前为止,我看到这个解决过的最优雅的方式(现在我已经使用了一些MVC实现)是只在数据库中存储相关数据。例如。您将在数据库中存储status =“red”,并将其保留在视图中,以便了解如何处理红色状态(就CSS而言)。然后通过设计一个足够高级的View层来解决问题,该层可以创建可重用的结构 - 这样,当css发生变化时,您不需要总是逐页更新内容。

将此信息传递给模型有点失败了内容/表示分离的点,因为现在您的代码需要知道从数据库中提取表示信息并将其转发到View级别,或者 shudder < / em>,你将在View层代码中从数据库中提取这些东西,这使得维护成为一场噩梦,因为你现在已经失去了对信息流的控制。

答案 1 :(得分:0)

如果要继续将其存储在数据库中的范例,可以创建另一个表,将状态的VARCHAR名称映射到相应的INTEGER ID。

但是,如果这是我的框架。我不会在数据库中存储这样的视图信息。这将由我MVC设置的V处理。

答案 2 :(得分:0)

从数据建模的角度来看:

  • 为每种“种类”的状态设置不同的表格;将用户状态与页面状态分开(例如) - 将类似实体组合在一起。
  • 不要将CSS类放入数据库中,而是使用某种形式的状态指示器 - 如果您事先知道可能的状态集,则可以是ENUM列。将其转换为视图层中适当的CSS类。您不希望最终导致无法更改CSS,因为数据库中的某些数据会阻止它。