Sql server TSQL-创建表设计

Sql server TSQL-创建表设计,sql-server,database-design,Sql Server,Database Design,我有一个- Table X ------------------------------------ TaskId (bigint-identity-primary key) Data1 (varchar), Data2(varchar) 现在,我正在创建一个新表- Table Y ------------------------------------ Id (identity, Primary Key) TaskId(FK to Table X) Data3(varchar)

我有一个-

Table X  
------------------------------------
TaskId (bigint-identity-primary key)  
Data1 (varchar), Data2(varchar)
现在,我正在创建一个新表-

Table Y 
------------------------------------
Id (identity, Primary Key)
TaskId(FK to Table X)
Data3(varchar)
现在,由于表X和表Y将基于TaskId列具有一一关系,因此我应该如何定义表Y上的主键、索引等

另外,如果在where子句中永远不会使用标识列作为主键,那么它是否值得呢
? 我只是按照惯例添加了它。

如果是一对一的关系,为什么要创建一个全新的表
Y
?只需将新的
Data3
列添加到表
X

如果是一对一关系,为什么要创建一个全新的表
Y
?只需将新的
Data3
列添加到表
X

中,假设您实际上有一个1:Many关系

将PK和聚集索引键保留在
ID
字段中


TaskID、Data3
上创建一个非聚集索引,或者,如果您从未对
Data3
进行筛选,并且只选择
它,那么只要
包含(Data3)
就可以了,假设您实际上有一个1:Many关系

将PK和聚集索引键保留在
ID
字段中


TaskID、Data3
上创建一个非聚集索引,或者,如果您从未对
Data3
进行筛选,并且只选择
它,只需
包含(Data3)
,因为这是
1:1
关系,并且每个
Y
都是
任务,您可以使用这种方法:

Table Y 
----------
TaskId (bigint),
Data3 (varchar),
PRIMARY KEY TaskId, 
FOREIGN KEY TaskId REFERENCES Task(TaskId)

如果只有少数任务是Y任务,而不是所有任务,我想这是有用的。而且您不希望表中有
NULL
s。

因为这是
1:1
关系,而且每个
Y
都是
任务
您可以使用这种方法:

Table Y 
----------
TaskId (bigint),
Data3 (varchar),
PRIMARY KEY TaskId, 
FOREIGN KEY TaskId REFERENCES Task(TaskId)

如果只有少数任务是Y任务,而不是所有任务,我想这是有用的。而且您不希望表中有
NULL
s。

如果您必须将其分开,并且您确定它将始终保持1-1,则使用taskID作为主键。如果未来可能是1-多个,那么添加一个标识并在taskid上放置一个唯一索引。然后,如果执行1-many,则只需删除唯一索引

如果您必须将其分开,并且您确定它将始终保持1-1,则使用taskID作为主键。如果未来可能是1-多个,那么添加一个标识并在taskid上放置一个唯一索引。然后,如果执行1-many,则只需删除唯一索引

让我们调用
TableX
table
Task
TableY
table
Y
。每件事都是一项任务吗?还是每一项任务都是一个问题?或者两者都是?如果每个Y是一个任务,并且每个任务只与一个Y相关(如1:1所示),而不是与多个Y相关(如FK定义所示),那么使用
Y.TaskId
作为任务的
主键和
外键。我应该说:“每个任务都与零或一个Y相关”让我们调用
TableX
table
Task
TableY
table
Y
。每件事都是一项任务吗?还是每一项任务都是一个问题?或者两者都是?如果每个Y是一个任务,并且每个任务只与一个Y相关(如1:1所示),而不是与多个Y相关(如FK定义所示),那么使用
Y.TaskId
作为
主键和
外键与任务。我应该说:“每个任务都与零或一个Y相关”,这就是设计,但是由于性能问题,它被分开了。如果应用,性能可能会提高,但如果是这样,Y的设计结构应该与X的设计结构保持一致,并且这个问题没有意义。@JNK-我不是DB专家。表X以前没有该列。所以,正如大家所相信的,我继续在表X中添加了我的新列,但在添加此列后对表X执行select查询时,我发现性能下降了10%。而且,这个新列只是一个只读列。因此,我试图创建一个新表,使表X保持原样。如果它是严格的
1:1
(而不是我认为的
0..1:1
),像@Lieven提到的那样拆分表就是垂直分区。查看他的链接了解该方法的利弊。在某些情况下,您可能会获得性能。也有可能您有自己的原始方法,只有一个表,没有问题。可能是列的添加导致了磁盘中表的碎片化?不知道。具有SQL Server专业知识的人可能会提出建议。这就是设计,但由于性能问题,它被分离。如果应用,性能可能会提高,但如果是这种情况,Y的设计结构应该与X的设计结构相同,并且这个问题没有意义。@JNK-我不是DB专家。表X以前没有该列。所以,正如大家所相信的,我继续在表X中添加了我的新列,但在添加此列后对表X执行select查询时,我发现性能下降了10%。而且,这个新列只是一个只读列。因此,我试图创建一个新表,使表X保持原样。如果它是严格的
1:1
(而不是我认为的
0..1:1
),像@Lieven提到的那样拆分表就是垂直分区。查看他的链接了解该方法的利弊。在某些情况下,您可能会获得性能。也有可能您有自己的原始方法,只有一个表,没有问题。可能是列的添加导致了磁盘中表的碎片化?不知道。SQL Server专家可能会提供建议。实际上,所有
Y
数据都将引用
任务
数据。这是严格的1:1。我不是数据库专家。表X以前没有该列。所以,正如大家所相信的,我继续在表X中添加了我的新列,但在添加此列后对表X执行select查询时,我发现性能下降了10%。而且,这个新列只是一个只读列。因此,我正在尝试创建一个新表,以便表X保持不变