具有多个值的实体的最佳设计

时间:2008-09-15 19:11:01

标签: design-patterns database-design

假设您有一个像车辆这样的实体,您正在捕获有关的详细信息。你想要捕捉的车漆成红色,黑色和白色。前轮胎是普利司通275 / 35-18,后轮胎是325 / 30-19。有时你可以只有两个轮胎(是的,这将被认为是一种摩托车,这是一种类型的车辆),有时18个轮胎可能都是不同的。然后有一些领域总是像发动机尺寸那样单一价值(如果我们让我们的想象力疯狂,我们可以想到多引擎车辆,但我试图保持这个简单)。

我们当前的处理策略是为每个可以有多个值的字段创建一个表。这将产生大量的表(我们有一堆具有此要求的不同实体)并且闻起来有点不好。这是最好的策略,如果不是,那会更好吗?

7 个答案:

答案 0 :(得分:1)

如果您的应用有可能,您可能需要查看couchdb

答案 1 :(得分:1)

如果您使用的是关系数据库,那么您的建议几乎是唯一的方法。 theory of normal forms将为您提供有关它的更多信息 - 维基百科关于它的文章相当不错,但稍微过重只是因为当您进入更高的标准化水平时它是一个棘手的理论主题。这些例子大多是常识。

假设您有一个Vehicle表,一个Color表和一个TyreType表(对不起英国拼写),您可能会定义一个VehicleTyre和VehicleColour表,它充当相关表对之间的连接。这种结构实际上非常健康。它不仅可以直接封装您想要的信息,还可以让您以自然的方式捕捉轮胎所在的东西(例如,左前方是普利司通275 / 35-18)或者有多少车被涂成红色(例如, VehicleColour表上的百分比字段。)

您可能想要建模一个可以控制轮胎数量的车型实体。虽然没有必要将SELECT查询从系统中取出,但它可能在您的用户界面和确定要插入表中的轮胎数量方面都很有用。

我的公司有很多模式在这个基础上运行 - 实际上我们的对象关系框架自动创建它们来管理多对多关系(有时甚至是一对多关系,这取决于我们如何建模它们)。我们的一些应用程序拥有超过150个实体和100多个连接表。没有性能问题,也没有对数据的可管理性产生有意义的影响,除了一些表名令人讨厌地长。

答案 2 :(得分:0)

您正在描述Star Schema。我认为在你的案例中它是相当标准的做法

编辑:实际上您的架构稍微从星型架构修改,您使用每个维度表中的事实表的主键来加入,因此您可以有多种颜色等。无论哪种方式,我认为它是罚款处理你的实体的方式。您可以更进一步规范维度表,然后您就拥有Snowflake Schema

答案 3 :(得分:0)

看起来你可能正在寻找一种名为Hierarchical Model的东西。

或者可能是(attr,value)对的简单列表?

答案 4 :(得分:0)

如果您使用的是SQL Server,请不要害怕存储XML Data Type。我发现它使得这样的事情变得更加容易。

答案 5 :(得分:0)

这实际上取决于变量本身是否只有一个变量(例如:您可以拥有可变数量的轮胎,这些轮胎都是相同类型,或者是一组可变类型的轮胎)。

由于您似乎需要有多个变量(例如,每个轮胎的特定类型,轮胎数量可变),我担心最好的解决方案是为您想要的汽车的每个特定区域设置特定的表格。定制

如果您有一些字段只有一组值可供选择(例如,2,4或6个窗口),您只需使用枚举或使用用户定义的域定义新的字段类型(取决于你正在使用哪个DBMS。

答案 6 :(得分:0)

您当前的策略是正确的。您正在跟踪这么多种类的数据,因此您需要大量的表格。就是这样。 DBMS在抱怨吗?