如何在MSSQL中的应用程序中表示行和列?

时间:2012-11-07 21:25:52

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

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

我想避免为应用程序中的每个表创建一个MSSQL表,所以我一直试图在两个表中一起表示所有表。

我已经定义了一个MyAppTable表,其中包含Id INTEGER主键和Name CHARACTER VARYING(255)列。

从那里开始,我已经定义了一个MyAppColumn表,其中的外键与MyAppTable.Id列相对应,并且还有一个Position INTEGER列来表示它在渲染表中的位置。

最后,我已经定义了一个MyAppRow表,其中包含MyAppColumn.Id列的外键并且具有Data BINARY(32)列。它是一个小文件表,所以这种数据类型是合适的。

实际问题是,我无法保证MyAppColumn.Position列对每个MyAppTable都是唯一的。

正常情况的一个例子:

  • MyAppTable Id 0
  • MyAppColumn Id 0,TableId 0,Position 0
  • MyAppColumn Id 1,TableId 0,Position 1
  • MyAppRow ColumnId 0,Data [某事]
  • MyAppRowColumnId 1,Data [某事物]
  • MyAppTable Id 1
  • MyAppColumn Id 2,TableId 1,Position 0
  • MyAppRow ColumnId 2,Data [某事]

我希望在数据库中无法实现的情况示例:

  • MyAppTable Id 0
  • MyAppColumn Id 0,TableId 0,Position 0
  • MyAppColumn Id 1,TableId 0,Position 0

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

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

1 个答案:

答案 0 :(得分:6)

您的问题的解决方案是不对表中的元数据进行编码,而是创建实际的表,即使它不方便或需要大量工作。

有些东西会很快咬住你的后方:

  • 无法建立任何关系
  • 无法索引
  • 没有输入验证(是日期,int还是图像?)
  • 无法获得实际准确的统计数据
  • 您撰写的每一条查询都将是一场噩梦

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

话虽如此,如果你代表一组非常有限的数据(就像你说的那样,只针对文件),我会考虑一个坐标系。

按原样保留MyAppTable

使用字段创建MyAppFile表:

  • FileId(int identity)
  • MyAppTableId(FK)
  • Data(varbinary)
  • XPos(int)
  • YPos(int)

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

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