C++ 在SQL Server 2012数据库中添加对特定于计算机的查找的支持
我必须维护一个带有SQL Server 2012后端的应用程序。 有一个数据库表,其中包含一组 机器参数设置,每列一个。 每个参数都是一个nchar(15)类型引用 依赖于类型的查找表,例如C++ 在SQL Server 2012数据库中添加对特定于计算机的查找的支持,c++,sql,sql-server,database-design,c++builder,C++,Sql,Sql Server,Database Design,C++builder,我必须维护一个带有SQL Server 2012后端的应用程序。 有一个数据库表,其中包含一组 机器参数设置,每列一个。 每个参数都是一个nchar(15)类型引用 依赖于类型的查找表,例如 CREATE TABLE L_MachineSettings ( ID uniqueidentifier NOT NULL PRIMARY KEY, ParentID uniqueidentifier, IsActive nchar(15) FOREIGN KEY REFERENCE
CREATE TABLE L_MachineSettings (
ID uniqueidentifier NOT NULL PRIMARY KEY,
ParentID uniqueidentifier,
IsActive nchar(15) FOREIGN KEY REFERENCES L_YesNo(Constant),
OnTime nchar(15) FOREIGN KEY REFERENCES L_Time(Constant),
Motor1_InitMode nchar(15) FOREIGN KEY REFERENCES L_InitModes(Constant),
...
and so on (nearly 60 parameters are following, some are ref. the same lookup-tables)
...
)
每个查找表的构建方式如下所示:
CREATE TABLE L_Lookup_YesNo (
Constant nchar(15) PRIMARY KEY,
TargetValue nvarchar(max),
NotSupportedBy nvarchar(max)
)
INSERT INTO L_Lookup_YesNo
(Constant, TargetValue)
VALUES
(N'No', N'0'),
(N'Yes', N'1')
有几种不同的机器类型,其中有些没有能力
由于硬件规格有限,无法接受所有查找表的所有值。
对于这些,查找表中的NotSupportedBy字段填充了未支持的机器类型
支持用分号分隔的值,例如
INSERT INTO L_Lookup_InitModes
(Constant, TargetValue, NotSupportedBy)
VALUES
(N'Standard', N'144A', NULL),
(N'Extended, N'144B', NULL),
(N'ExtendedPlus' N'144Z', N'AU1220;AU1221'),
(N'ExtendedPlusB' N'144D', N'AU1220;AU1221;AU1401')
机器类型本身在单独的表格中定义:
CREATE TABLE L_MTypes (
Name nchar(6) PRIMARY KEY,
Comment nvarchar(max)
)
INSERT INTO L_MTypes
(Name, Comment)
VALUES
(N'AU1220', N'Basic Edition'),
...
仅允许部分实现L_MachineSettings行
因此它可以包含空值,只要它是ParentID
属性已设置为包含缺少的
参数。
此外,子行值将覆盖父行的值,
因此,可以通过创建基本设置来构建层次参数结构
以及在引用时仅为新设置添加不同的值
所有其他值。如果要更改基准值,则“通过”更改为
它是自动生成的,所以XML文件代表最终的格式
其中,发送给客户的数据始终包含所有最近的更改
我现在面临的挑战是如何生成那些列查找值
特定于机器的,同时不抛出现有的数据库布局
在堆上。
所以我需要的是一种将多个查找值存储到设置字段中的方法,
它将与机器类型关联。如果没有特定机器的特定值
类型可用,导出时应使用常规值。机器特定值
也应该从查找表中获取。
一件重要的事情是:在GUI(用C++Builder编写)旁边,一些用户也是
通过MS Access访问SQL Server DB,这些用户不是数据库方面的合格人员(您知道
我的意思是),所以现有的结构应该只有微小的变化
到目前为止,我的想法是:
- 将新列MType添加到L_MachineSettings以将特定于计算机的选项添加到ParentID设置
- 通过分号分隔向字段添加特定于机器的值,例如“是;AU1220:否”
在这里,谁能为我提供一些最佳实践?在一个元组中存储多个值是一个可怕的想法。它违反1NF,只会引起疼痛。不要像这样存储分隔值。你必须不断地把它们分解成可用的表格格式,这样你就可以操纵数据,然后再把它们重新组合在一起。任何地方存储一个分隔列表,都可以考虑(1)将它分解成新表中的新字段。(如果分隔列表中的值不具有同一概念的多个值,即电话号码,则这是正确的)或(2)添加链接到原始表的新表。根据多部分列表中定义的内容,您可能必须同时执行这两项操作。这是处理此问题的正确方法。注意:如果您不能修改基表,也可以将其他表用于案例(1)。