通用数据库设计方法

发布于 2024-08-02 02:17:50 字数 762 浏览 8 评论 0原文

我面对客户的应用程序如下所示:

  • 它允许最终用户输入“材料”。
  • 对于这些材料,他们可以附加任意数量的“属性”。
  • 属性可以具有任何类型的值:decimal、int、dateTime 和 varchar(长度从 5 个字符到大块文本不等),

本质上,架构如下所示:

材料
MaterialID int not null PK
MaterialName varchar(100) not null

属性
属性ID
PropertyName varchar(100)

材质属性
材质ID
属性ID
PropertyValue varchar(3000)

该应用程序的一个基本功能是搜索功能: 最终用户可以通过输入以下查询来搜索材料:

  • [property] InspectionDate > [DateTimeValue]
  • [property] serialNr = 35465488

猜猜它在包含近 200 万条记录的 MaterialsProperties 表中的表现如何。

数据库最初是在 SQL Server 2000 下创建的,后来迁移到 SQL Server 2005,

如何才能做得更好?

An application that I'm facing at a customer, looks like this:

  • it allows end users to enter "materials".
  • To those materials, they can append any number of "properties".
  • Properties can have a any value of type: decimal, int, dateTime and varchar (length varying from 5 characters to large chunks of text),

Essentially, the Schema looks like this:

Materials
MaterialID int not null PK
MaterialName varchar(100) not null

Properties
PropertyID
PropertyName varchar(100)

MaterialsProperties
MaterialID
PropertyID
PropertyValue varchar(3000)

An essential feature of the application is the search functionality:
end users can search materials by entering queries like:

  • [property] inspectionDate > [DateTimeValue]
  • [property] serialNr = 35465488

Guess how this performs over the MaterialsProperties-table with nearly 2 million records in it.

Database was initially created under SQL Server 2000 and later on migrated to SQL Server 2005

How can this be done better?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南七夏 2024-08-09 02:17:50

您可以考虑按类型将MaterialsProperties 表分隔为IntMaterialPropertiesCharMaterialProperties 等。这将:

  • 对数据进行分区。
  • 允许对整数(或其他数字)类型查找进行可能更快的查找。
  • 可能降低存储成本。

您还可以向 Properties 引入一个 Type 列,您可以使用该列来确定要查询哪个 MaterialProperties 表。 该列还可用于验证用户输入的类型是否正确,从而无需查询给定的“错误”输入。

You could consider separating your MaterialsProperties table by typel e.g. into IntMaterialProperties, CharMaterialProperties, etc. This would:

  • Partition your data.
  • Allow for potentially faster look-ups for integer (or other numeric) type look-ups.
  • Potentially reduce storage costs.

You could also introduce a Type column to Properties, which you could use to determine which MaterialProperties table to query. The column could also be used to validate the user's input is of the correct type, eliminating the need to query given "bad" input.

蓝戈者 2024-08-09 02:17:50
  1. 由于用户可以输入自己的属性名称,我想每个查询都将涉及属性表的扫描(在您的示例中,我需要找到 [inspectionDate] 的 propertyid)。 如果属性表很大,您的连接也会花费很长时间。 您可以尝试通过反规范化并使用 propertyID 存储名称来进行优化。 这将是 MaterialsProperties 表中的非规范化列。
  2. 您可以尝试将属性类型(int、char 等)添加到 Materialsproperty 表中,并根据该类型对表进行分区。
  3. 查看用于查询优化的对象关系映射/实体属性值模型技术。
  4. 由于您已经拥有大量数据(200 万条记录),请进行一些数据挖掘,看看许多材料是否存在重复的属性组。 您可以将它们放在一个模式中,其余的作为 EAV 表。 请参阅此处了解详细信息:http://portal.acm.org/itation.cfm?id=509015&dl=GUIDE&coll=GUIDE&CFID=49465839&CFTOKEN=33971901
  1. Since users can enter their own property names, i guess every query is going to involve a scan of the properties table (in your example i need to find the propertyid of [inspectionDate]). If the properties table is large, your join would also take a long time. You could try and optimize by denormalizing and storing name with propertyID. This would be a denaormalized column in the MaterialsProperties table.
  2. You could try adding a property type (int, char etc) to the materialsproperty table and partition the table on the type.
  3. Look at Object Relational Mapping/Entity Attribute Value Model techniques for query optimization.
  4. Since you already have a lot of data (2 million records) do some data mining as see if there are repeating groups of properties for many materials. You can them put them in one schema and the rest as the EAV table. Look here for details: http://portal.acm.org/citation.cfm?id=509015&dl=GUIDE&coll=GUIDE&CFID=49465839&CFTOKEN=33971901
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文