SQL / C#-为具有50多个功能的产品设计表(是/否)

时间:2018-07-09 10:21:10

标签: c# sql linq

我在设计可容纳我们产品功能的新桌子时遇到了问题。刚开始,我将功能硬编码成这样的列:

ProductExtrasID | Feature 1 | Feature 2 | Feature.. 50
1                 true         true         false
2                 false        true         false

..依此类推..,我使用ProductExtrasID作为产品表的外键,并且仅显示“ True”功能。

现在,我被要求动态执行功能,以便站点的每个管理员都可以添加新功能。

到目前为止我想做的是

ProductExtrasID |ProductID | Feature Description   | FeatureActive
    1                20        feature1 description      false
    2                20        feature2 description      true
    3                30        feature1 description      true
   ...

然后显示每个产品ID的功能,其中FeatureActive为true。

这是实现我想要的目标的一种好方法还是可以做得更好?

谢谢

3 个答案:

答案 0 :(得分:3)

为所有功能创建表格:

ID  |  Feature Description
1     feature1 description
2     feature2 description
3     feature1 description

然后在表ProductsFeatures中使用它:

ProductExtrasID |ProductID | FeatureID
    1                20        1      
    2                20        2      
    3                30        1

如果需要显示以下内容:

Product20: 
    feature1: true,
    feature2: true,
    feature10: false.
(and not show another 47 features)

您需要创建其他表ProductTypesFeatures:

ProductTypeID |FeatureID
1                1      
1                2 
1                10
2                1

答案 1 :(得分:2)

您应该有一个单独的产品表和功能表。 然后,您可以使用链接表链接两个表。

您可以将链接表称为“ ProductFeatureLink”。它应该类似于以下内容:

ProductExtrasID|FeatureID|FeatureActive

1              |1        |false   
1              |2        |true
2              |1        |true

单独的功能表将允许创建/删除功能,并允许您在多对多场景中轻松地将其链接起来。

答案 2 :(得分:0)

  

这是完成我想要的事情还是可以完成的好方法   更好吗?

是的,这样会更好。

您应该问自己,将产品与其功能分开是否有意义。问自己:两个不同的产品可以具有相同的产品功能吗?两种不同的产品可以具有“颜色为绿色”,“ XL尺寸”,“ LCD触摸屏”功能吗?如果没有产品,该功能有意义吗?可能是某个功能尚不存在,但将来可能会存在(“太阳能供电”),可能是您的任何产品都不再使用该功能(“蒸汽供电”)

我认为您希望能够向数据库中添加新功能,而不必在其中一个表中添加列。您希望能够更改功能的一个或多个属性(例如描述),而不必更改数据库的结构。

将当前布局与布尔值一起使用将不允许添加新功能:不灵活。 “蒸汽供电”功能对您所有产品的价值都是虚假的:浪费空间和处理能力,您的功能不能具有任何属性。

如果您在产品和功能之间实现了多对多关系,则将解决以下问题:每个产品具有零个或多个功能;每个功能都被零个或更多产品使用/拥有:

class Product
{
     public int ProductId {get; set;}
     public string Name {get; set;}
     public DateTime IntroductionDate {get; set;}
     ...

     // every Product has zero or more features
     // many-to-many using a junction table
}
class Feature
{
    public int Id {get; set;}
    public string Description {get; set;}
    ...
    // every feature is had by zero or more products
    // many-to-many using a junction table
}

联结表:

public class ProductsFeatures
{
    public int ProductId {get; set;}   // Foreign key to Products
    public int FeatureId {get; set;}   // Foreign key to Features
}

要为产品P1提供功能F1,只需在ProductsFeatures中添加一行(P1,F1)即可。

如果产品P2具有以下功能:F2:“黑白屏幕”,并且要将其更改为功能F3:“彩色屏幕”,只需删除ProductsFeature(P2,F2)并添加(P2,F3)。具有黑白屏幕的所有其他产品仍将具有黑白屏幕。

如果要更改所有具有“黑白屏幕”和“黑白屏幕”的产品的功能文本,则只需更改F2的描述,所有产品的描述都将更新。

如果要删除产品P1,您要做的就是在删除P1之前先从ProductsFeatures中删除所有(P1,...)。如果您仍然尝试引用P1的功能,则您的数据库将警告您,如果您尝试删除P1