规划描述多版本产品的数据库

时间:2014-07-29 12:45:13

标签: sql database

我是数据库的新手,所以我提前为一个菜鸟问题道歉。

我需要计划一些打印机执行的数据库记录打印作业。这些打印机有多个版本,每个版本可能会在作业日志中生成不同的字段集。但是,其中一些字段在所有打印机版本生成的日志中都是相同的。 一个非常简单的例子是:

打印机版本1.0可能会生成包含以下字段的日志记录: [作业ID],[日期],[打印机版本],[介质高度],[介质宽度]

虽然2.0版本可能会产生以下内容: [作业ID],[日期],[打印机版本],[使用的青色碳粉(mg)],[使用的品红色碳粉(mg)],[使用的黄色碳粉(mg)],[使用的黑色碳粉(mg)] < / p>

所有这些日志数据都应该保存在同一个数据库中,用户可以只在一个打印机版本,几个甚至所有打印机版本上运行查询(例如,要求在特定时间段内返回所有作业的查询,无论打印机或其版本)。此外,还会有一些不同百分比的计算等。

将来可能会出现新的打印机版本,每个版本都有一组字段,目前还不知道哪些字段在所有打印机中都会保持通用。

我该如何处理?这不是传统的雇主/雇员数据库场景,因为我们在这里处理基本相同的概念对象(打印作业记录),其略有变化。我应该......:

  1. ...为所有打印机版本创建一个数据库?但是,对于那些不为这些字段提供数据的打印机,字段中将显示空值。
  2. ...为每个打印机版本定义一个表格?但随后会出现相同的字段(如[Date])。那不是浪费吗?
  3. ...定义一个核心表,其中包含所有公共字段(示例中的[作业ID],[日期],[打印机版本])以及包含该版本特有的字段的其他表(每个版本一个)?但是未来哪些领域将是常见的未知。
  4. 还有其他想法吗?
  5. 当然,我需要考虑性能问题,因为这些表会随着时间的推移而变得非常大(数百万条记录)。但是用户不多。而且......我在Access上做了所有这些。

    提前致谢!

3 个答案:

答案 0 :(得分:1)

<强> 1。研究

为了解决这个问题,我首先要对打印作业进行一些研究,特别是那里已经有了一个你可以使用的标准吗?甚至是已经解决了你需要的工具?

<强> 2。搜索条件

如果没有可以使用的标准,我会尝试确定用户如何搜索/查询/汇总您要记录的打印作业数据。这些常用字段将成为您在中心表上所需的主要数据元素。

第3。关键值对

要获得一组完全通用的打印作业属性,您可能需要某种键值对,这可以通过以下方式完成:

  • 键/值表结构,即:
    • 通用字段列表
    • 映射表以显示哪些字段对哪个打印机/版本
    • 有效
    • 用于记录实际打印作业的字段和值的实际日志表

示例表结构:

TABLE [PrinterVersion] ( [ID] INT, [PrinterType] VARCHAR(100), [PrinterVersion] ...)
TABLE [PrintJobFields] ( [ID] INT, [FieldName] VARCHAR(100), [FieldType] ...)
TABLE [PrinterVersionFields ( [PrintJobFieldID] INT, [PrinterVersionID] INT, [Required] BOOLEAN )
TABLE [PrinterJobValues] ( [PrintJobFieldID] INT, [Value] NVARCHAR(1000) )
  • 打印作业表上的XML数据字段

答案 1 :(得分:1)

第三个解决方案是将所有内容存储在一个巨大的JobData表格中,该表格中有足够的字段来覆盖所有可能的打印机(至少目前为止)。

然后,您可以拥有一个单独的PrinterConfig表,其中包含每种打印机类型的记录,并且对于主表中可用的每个字段,都存储一个布尔值,以指示该字段是否正在使用中。 /> 这有助于您显示或隐藏报表/数据表中的字段,以显示给定打印机的数据。

当然,在迄今为止人们给你的所有例子中,你必须决定是否需要一个面向未来的系统,你需要花费大量时间在应用程序的设计中使其完全通用,或者如果您可以在以后按照新打印机的要求维护和添加更多字段,那么就可以了。

这里没有正确的答案:这将是一个权衡。当您拥有无模式或动态数据模式时,在关系数据库中存储和查询数据并不容易。

您可以根据需要通过创建新字段来自动调整系统,但您仍然需要构建应用程序以适应缺少静态数据结构。

无论如何,它需要相当多的编码。

答案 2 :(得分:0)

我可能会将一致的字段存储在一个表中:

[Job ID], [Date],[Printer Version]

然后将所有细节分开并将它们垂直存储在一个单独的表中: [作业ID] [详细] [值]

所以基于你的第一个例子,在你的第一个表中你有第二个表中的ID等,你会有这样的行:

    [Job ID]   [Detail]         [Value]
    ________________________________________
    <job id>   <media height>     <x>
    <job id>   <media width>      <y>