【发布时间】: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 都是唯一的。
一个正常情况的例子:
-
MyAppTable与Id0 -
MyAppColumn与Id0、TableId0、Position0 -
MyAppColumn与Id1、TableId0、Position1 -
MyAppRow与ColumnId0、Data[某事] -
MyAppRow与ColumnId1,Data[某事] -
MyAppTable与Id1 -
MyAppColumn与Id2、TableId1、Position0 -
MyAppRow和ColumnId2,Data[某事]
我想在数据库中使不可能的情况示例:
-
MyAppTable与Id0 -
MyAppColumn与Id0、TableId0、Position0 -
MyAppColumn与Id1、TableId0、Position0
如您所见,我想要一些约束一对列的方法。 TableId 和 Position 两列应该是 UNIQUE,但如果这是独立完成的,这意味着两个表永远不会有列在 Position 为 0。
如何在 Microsoft SQL Server 2012 中完成此操作?
【问题讨论】:
-
这是一个真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的真的 糟糕的设计模式,特别是如果唯一的好处是您不必费心创建一堆表格来表示表格。
-
你到底为什么要这样设计你的数据库?你要求这个设计有很多麻烦。这太复杂了,如果你被公共汽车撞到,没人会知道你在做什么。
-
也许如果您详细说明您的应用程序在做什么,提供一些示例数据等,我们可以帮助您提出更好的数据库设计。我什至无法想象你会如何查询它。
-
嗯,我没想到会有这么多的负面反馈。老实说,我不认为它是 那么 糟糕的设计。尤其是在和同事谈过之后。基本上,我们正在显示一个文件网格,每个文件都需要位于特定的列和特定的行中,系统才能正常工作。我们想在数据库中表示它。每个网格都非常像一张桌子。每一行真的是一行,每一列真的是一列。我的第一个想法是为我们计划表示的每个网格创建真正的表格,但它无法维护;此外,它们都是相同的结构。
-
@MichaelJ.Gray 每个网格中每个项目的数据是否基本相同(它们都是文件名或其他)?如果它只是您需要的网格,那么您可能想要做一个坐标系
标签: sql-server constraints sql-server-2012