2011-06-30 34 views
4

我试图设计一些数据库表来存储有关某些实体及其相关应用程序的配置设置。我能走得如此之远,但却遇到了“砖墙”。我会告诉你我的意思是...(不要把以下内容:图片,作为一个字面上的商业问题,图片只是向你解释我的问题的简单方法)。数据库模式设计 - 如何根据实体存储特定的应用程序设置

标准

  1. 我们有图片的目录下载。
  2. 我们有几个应用程序,可以 消费这些 图片的任何数量。
  3. 我们想要配置如何在应用程序上显示这些图片 ,具体取决于

记住熊,每个程序都可以配置为显示画面的具体和独特的方式。

所以很明显,我们需要2个表图片,应用程序和一个结表以显示MM的关系,尽可能多的图片可以在许多应用中 - 见下:

enter image description here

我强调在红色的“CONFIG_TABLE”列 - 我有一个非常强烈的怀疑,这是不好的,非常非常糟糕。据显示,对于paricular应用程序,这是存储在设置的配置表见下:

enter image description here

所以 - 有非常speicific应用程序的配置适用于图片,这取决于你是什么应用程序谈论。现在假设设计被破坏了,因为我相信它 - 我怎么实际设计数据库来正确地建模? (希望这是有道理的)

+0

告诉我,如果在app表中包含一个包含所有所需PIC_ID的配置表,那么单独的PICTURE_APP表的必要性是什么?你是否也意识到CONFIG_TABLE列明显违反了1NF? – mihsathe

+0

我知道这是明显违规 - 这就是为什么我说它是一个破碎和糟糕的设计。PICTURE_APPLICATION表在那里,因为我想知道什么图片与什么应用程序相关联。 – Vidar

+0

假设在“名称”上有一个唯一的约束,表“应用程序”在5NF。一些有问题的设计决定与标准化无关;这是其中之一。 –

回答

5

设计离正确不远。你根本不需要application.config_table列。相反,每个应用程序应该知道哪个表与其自己的图片使用有关。

因此,例如在PicManager应用程序,你可以这样做:

SELECT p.*, c.* 
FROM Picture_Appliation AS pa 
INNER JOIN Picture AS p ON pa.pic_id = p.pic_id 
LEFT OUTER JOIN Picman_Config AS c ON p.pic_id = c.pic_id 
WHERE pa.app_id = 100; 

而且在其他各个应用程序的,你会在你的查询代码不同的配置表中。

不要试图将其设置为“自动”或“数据驱动”。只需编写适合每个应用程序的代码即可。您可以将数据驱动的方法用于数据值(例如app_id = 100),但不能使用代码。数据是数据。代码是代码。

您可能只想编写一个可用于所有应用程序的可重用类,但这是子类的用途。

+0

有呀!所以,就像我经常做的那样,我让事情变得比他们应该更复杂 - 现在你已经向我展示了第三种方式!,你所说的话是合理的。非常感谢比尔,我从来没有想过以这种方式设计架构。 – Vidar

+0

是的,也请参阅http://stackoverflow.com/questions/1103299/help-me-understand-this-brian-kernighan-quote –

+0

感谢@BillKarwin和V对于这样一个出色的问题和答案。我也在同一条船上,我需要为我们的应用程序创建一个配置表,这给了我一个很好的开始pioint :)。 – Sizons