我使用表GadgetData
在我的应用程序中存储小工具的属性。小工具基本上是一种自定义控件,它具有80%的常见属性,如高度,宽度,颜色,类型等。每种小工具类型都有一些属性,这些属性对于它们是唯一的。所有这些数据都必须存储在数据库中。目前我只存储常用属性。我应该使用什么样的设计方法来存储列是动态的这种数据。
(注意:小工具类型的数量可能会增长到100以上)
答案 0 :(得分:3)
选项3是一个非常规范化的选项,但是如果您需要查询多个类型,它会回来并咬你 - 如果添加了新类型,每个SELECT
将有另一个连接。维护噩梦。
选项2(稀疏表)将具有大量NULL值并占用额外空间。如果将来添加其他类型,表定义也需要更新。不是那么糟糕但仍然很痛苦。
我在制作中使用选项1(使用xml
类型而不是text
)。它允许我序列化从我的常见类型派生的任何类型,提取公共属性并将唯一的属性保留在XmlProperties
列中。这可以在应用程序或数据库中完成(例如存储过程)。
答案 1 :(得分:1)
您的选择:
备注:强>
如果您希望保持数据库“关系”,但又不怕使用ORM工具,那么我会使用一个。在哪种情况下,您可以根据需要存储数据(几乎),但只要您正确映射它们就可以正确处理。 参见:
如果您需要仅限SQL的解决方案,那么根据您的RDBMS,我可能会使用XML列来存储特定于小工具类型的所有数据:您可以进行验证,使用新属性轻松扩展。然后,您可以将所有内容放在一个表格中,快速搜索所有常见属性,还可以轻松搜索一个小工具的类型属性
答案 2 :(得分:1)
如果所有类型的小工具都有许多常见的必需属性,可以存储在一个表中,而只有几个可选属性,那么最好使用第一种方法:因此,您将使用最好的关系模式,并通过XML简化生活。并且不要忘记使用链接XML列的XML Schema集合:您将拥有完整的索引和XQuery功能。
如果小工具类型具有非常不同的描述,并且在5个或更多不同的属性集中只有1-3个常用列,请使用第3种方法。
但是关于100多种类型的小工具的情况,我会使用第一种方法:它具有良好的性能,易于支持和进一步开发的灵活性。
答案 3 :(得分:0)
根据“小工具”的不同,我不喜欢选项2,会有很多空值浮动,如果你有一个专用于一个小工具但不用于另一个小工具的列可能会变坏
如果小工具的数量不经常更改,我只会选择第3项,因为每次都需要更改数据库。
未提及的选项是使用包含小工具唯一值的子表存储小工具。但这需要相当多的工作来返回小工具详细信息或多个数据库调用。
离开选项1,除了我使用SQL服务器XML类型而不是文本之外,您可以在存储过程中使用XQuery。