我正在尝试使用SQL Server在C#中创建一个布料管理系统。
我有多个多对多的关系,这是存储室和各种衣服(躯干衣服,裤子,鞋子,配件)之间的关系。我不想做4个多对多的关系(这将花费我很多其他表,因为我仍然有这些表的多对多关系,例如:服务和项目之间的关系......)所以我决定将所有这些合并到一个表中。
结果是我在该表中得到了太多空值:
我如何摆脱这些并使我的程序更新为null值(如果存在)并插入一个新行以防所有内容都被填充?
这里是源代码:(serviceId表示存储室ID,'Id'是要插入的项目的ID):
SqlCommand cmd;
switch (columnName)
{
case "St_I_accessoryId":
cmd = new SqlCommand("INSERT INTO ClothStore.dbo.StoringRooms_Items VALUES ('" + serviceId + "', '" +
Id + "',null,null,null)", db);
break;
case "St_I_torsoClothId":
cmd = new SqlCommand("INSERT INTO ClothStore.dbo.StoringRooms_Items VALUES ('" + serviceId + "', null" +
", '" + Id + "',null,null)", db);
break;
case "St_I_trouserId":
cmd = new SqlCommand("INSERT INTO ClothStore.dbo.StoringRooms_Items VALUES ('" + serviceId + "', null" +
",null,null,'" + Id + "'")", db);
break;
case "St_I_shoeId":
cmd = new SqlCommand("INSERT INTO ClothStore.dbo.StoringRooms_Items VALUES ('" + serviceId + "', null" +
",'" + Id + "',null)", db);
break;
default:
//return -1;
throw new StoringItemException();
}
try
{
cmd.ExecuteNonQuery();
}
catch
{
//this should'nt be reached.
//return 2;
throw new StoringItemException();
}
感谢。
答案 0 :(得分:1)
您的问题的答案可能是将您的案例陈述更改为类似下面的代码。注意,我没有测试,所以这段代码可能有拼写错误或错误。
string sql="";
case "St_I_accessoryId":
sql = string.Format(@"
IF EXISTS(SELECT 1 FROM ClothStore.dbo.StoringRooms_Items WHERE St_I_serviceid = {0}
BEGIN
UPDATE ClothStore.dbo.StoringRooms_Items
SET ser_I_accessoryId= {1}
WHERE St_I_serviceid = {0}
END
ELSE
BEGIN
INSERT INTO ClothStore.dbo.StoringRooms_Items VALUES ('{0}', '{1}',null,null,null)
END
",serviceId,Id)
cmd = new SqlCommand(sql, db);
break;
人们没有回答实际问题的原因是因为问题本身意味着您的设计和代码存在问题。
通过减少关系数量来改善RELATIONAL数据库是很少见的。任何问题都应该很容易解决 - 性能意味着你有其他问题,复杂性很容易用视图解决等等。
您发布了包含拼写错误的代码。这意味着代码将无法编译。
你描述了“正确”的方式,然后你做了别的事情,并想知道为什么它不起作用。
答案 1 :(得分:0)
如果要获得更多这样的多对多关系,那么合并到一个表中可能不是最好的方法。当您向此表添加更多关系时,合并表中的NULL值将增加。您使用StoringRoom_Items显示的原始设计与各个项目表具有关系,这将是相对更优化的。因此,适用于所有类型的项的常见列将驻留在该合并表中,而特定类型的列将驻留在该类型的相应表中,例如,鞋。在不影响其他项类型的情况下,为每个特定类型表添加列或执行其他维护相对容易,您可以减少NULL值方案,并且您的表相对更加规范化。