2012-09-20 59 views
5

我使用.NET中的N层应用(C#,SQL Server)的工作中。我从设计数据库开始,因为我相信从头开始会是一个好主意。现在我需要你的建议来建立数据库,非常灵活。知道该应用程序旨在构建为一组插件。 (汽车,发动机等) 这是一个数据库表的片段。设计数据库在N层应用

  1. 设备表
  2. 人员表
  3. 用户表
  4. 角色表

正如你所看到的设备表就是代表我们正在控制设备的表和因为每个每个设备可能具有比其他设备更多或更少的属性,我希望将每个设备链接到其属性,这些属性可能位于尽可能优雅的另一个表中。人员表是供设备负责人使用的,例如:汽车司机(每辆车可能有多个司机),发动机操作员等。

用户是应用程序用户,因为你可以看到我已经分开用户和角色分成两个不同的表格。

我所寻找的是对设备链接到其属性的一种方式。另外,在应用程序中,每个设备都是可附加设备的一个实例。这意味着我可以将名为say:SIM卡的设备连接到名为Vehicle的设备。此外,有没有关于这个主题的设计模式?

在此先感谢,并请原谅我,如果我不明白。

+0

[composite](http://www.oodesign.com/composite-pattern.html) –

+0

有关使用Composite模式的一个问题是,例如,我想显示SIM报告并知道SIM埋入深入到复合树中我需要一种遍历树的方式,可能使用访问者模式。 –

回答

1

根据你将如何处理你的数据层这个数据库设计可能是一个争议点。如果你要使用EntityFramework和代码优先的方法,你可以使用它创建你的逻辑实体,并从你的模型中生成数据库。

大多数基于ORM的解决方案提供了一些方法来根据您的对象关系创建数据库,但尽管您可以快速轻松地获取数据库并运行,这将完全符合您的需求,但如果要开始使用模式你可能会遇到麻烦,尽管你可以做很多推断来帮助它按照你想要的方式在后台创建数据库。

如果这是一个新建项目,并且您不需要适应任何遗留数据库系统,那么我暂时不必担心您的数据库,只需编写逻辑模型并定义它们之间的关系,并让数据存储问题处理他们自己。

+0

是的,我没有使用任何遗留代码。 –

1

这里真正的决策是:在你的设备和属性表。其他人都很标准。

一台设备的一个或多个属性进行选择性关联,那么你真正需要的是在你的属性表中的空的外键。但是这引出了一个非常重要的问题:某些设备是否有必要拥有一套非常特定的属性?您的应用程序是否会期望为您的'汽车'设备提供'模型'属性? 我们如何通过这种设计确保数据库的完整性?

您可以通过数据库定义的约束做到这一点。但是,您应该如何知道“汽车”设备需要“模型”属性?也许你需要每个设备的模板定义:DeviceType和PropertyType表。通过这种方式,您的约束将始终知道在更新/插入记录时预期哪些属性。此外,这将使您可以轻松处理应用程序中的数据。

+0

有关属性的一件事是,当它们稍后映射到表示层时,它们将具有不同的类型,其中一些可能只有布尔值,而另一些则采用字符串或数字范围。这意味着属性本身将具有不同的“值类型” –

+0

可以在您的DeviceType-PropertyType定义中定义。 – davenewza

0

对于任何事情都没有理想的数据库设计。它可以根据您操作的信息快速更改。

一种简单的方法是列出设计中的所有类,然后将这些类分解到可能的最低级别,而不需要任何重复数据。

即使每个设备都有不同的属性,您可以将设备分类到它们各自的组中,并且一组将具有大部分类似的属性。您可以构建一个包含该组所有属性的属性表。如您所说,您可以使用deviceID和propertyID将它们连接到不同的表中。同样的事情适用于个人和设备。您可以根据您拥有的属性将人员表分成更小的部分。

如果大量表格按照数据极限形成一个集群,那么可以考虑一个星型模式来为您的解决方案提供一个中心的事实数据表(实数)以及与其相关的数据。

祝你好运!