我在设计可容纳我们产品功能的新桌子时遇到了问题。刚开始,我将功能硬编码成这样的列:
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。
这是实现我想要的目标的一种好方法还是可以做得更好?
谢谢
答案 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