【问题标题】:How can I represent rows and columns in an application in MSSQL?如何在 MSSQL 中表示应用程序中的行和列?
【发布时间】:2012-11-07 21:25:52
【问题描述】:

我有一个显示表格信息并允许用户输入和编辑它的应用程序。我一直在为此进行数据库设计,并遇到了以下问题。

我想避免为应用程序中的每个表都创建一个 MSSQL 表,因此我一直尝试将所有表一起表示为两个表。

我已经定义了一个MyAppTable 表,它具有Id INTEGER 主键和一个Name CHARACTER VARYING(255) 列。

从那里,我定义了一个MyAppColumn 表,它针对MyAppTable.Id 列的外键,还有一个Position INTEGER 列来指示它在呈现表中的位置。

最后,我定义了一个MyAppRow 表,它针对MyAppColumn.Id 列的外键,并有一个Data BINARY(32) 列。这是一个小文件表,所以这种数据类型很合适。

实际的问题是我不能保证MyAppColumn.Position 列对于每个MyAppTable 都是唯一的。

一个正常情况的例子:

  • MyAppTableId 0
  • MyAppColumnId 0、TableId 0、Position 0
  • MyAppColumnId 1、TableId 0、Position 1
  • MyAppRowColumnId 0、Data [某事]
  • MyAppRowColumnId 1,Data [某事]
  • MyAppTableId 1
  • MyAppColumnId 2、TableId 1、Position 0
  • MyAppRowColumnId 2,Data [某事]

我想在数据库中使不可能的情况示例:

  • MyAppTableId 0
  • MyAppColumnId 0、TableId 0、Position 0
  • MyAppColumnId 1、TableId 0、Position 0

如您所见,我想要一些约束一对列的方法。 TableIdPosition 两列应该是 UNIQUE,但如果这是独立完成的,这意味着两个表永远不会有列在 Position 为 0。

如何在 Microsoft SQL Server 2012 中完成此操作?

【问题讨论】:

  • 这是一个真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的 糟糕的设计模式,特别是如果唯一的好处是您不必费心创建一堆表格来表示表格。
  • 你到底为什么要这样设计你的数据库?你要求这个设计有很多麻烦。这太复杂了,如果你被公共汽车撞到,没人会知道你在做什么。
  • 也许如果您详细说明您的应用程序在做什么,提供一些示例数据等,我们可以帮助您提出更好的数据库设计。我什至无法想象你会如何查询它。
  • 嗯,我没想到会有这么多的负面反馈。老实说,我不认为它是 那么 糟糕的设计。尤其是在和同事谈过之后。基本上,我们正在显示一个文件网格,每个文件都需要位于特定的列和特定的行中,系统才能正常工作。我们想在数据库中表示它。每个网格都非常像一张桌子。每一行真的是一行,每一列真的是一列。我的第一个想法是为我们计划表示的每个网格创建真正的表格,但它无法维护;此外,它们都是相同的结构。
  • @MichaelJ.Gray 每个网格中每个项目的数据是否基本相同(它们都是文件名或其他)?如果它只是您需要的网格,那么您可能想要做一个坐标系

标签: sql-server constraints sql-server-2012


【解决方案1】:

解决您的问题的方法是不在表中编码元数据,而是创建实际的表,即使这样做不方便或工作量很大。

一些东西很快就会在你的后方咬你:

  • 没有关系可以建模
  • 无法索引
  • 没有输入验证(是日期、整数还是图像?)
  • 无法获得实际准确的统计数据
  • 您编写的每一个查询都将是一场噩梦

在未来为自己节省大量时间和精力,现在只需在设计阶段制作实际表格即可。 This type of meta-data "god table" has been tried repeatedly and never works.

话虽如此,如果您要表示一组非常有限的数据(如您所说,仅用于文件),我会考虑使用坐标系。

保持您的 MyAppTable 不变。

创建一个带有字段的MyAppFile 表:

  • FileId(整数身份)
  • MyAppTableId (FK)
  • Data (varbinary)
  • XPos (int)
  • YPos (int)

(MyAppTableId, Xpos, Ypos) 具有唯一约束。

这更准确地代表了您要存储的内容,更易于维护,并允许您强制执行完整性。

【讨论】:

  • 将此标记为解决方案,因为它是我们所显示内容的精确表示。似乎简单的解决方案通常是正确的。再次感谢。
  • 虽然它没有做的一件事是支持在网格中命名列的要求。我们通过制作一个单独的列名表添加了这一点,因为它们在每个网格中都是相同的。我们还针对列名表对列位置进行了外键化,这样每一列都会有一个名称。
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多