良好的数据库架构

| 好的,所以我有我需要解决的问题...这是我的网站 我需要做的是,对于售出的每种产品,我都需要另外2种产品,它们既可以升级,也可以降级。 因此,每种产品都有3类标准,业务和高级产品,并根据当前产品的价格提高或降低。 所以基本上他们是在定制每种解决方案。所以我需要的是找出为此构建数据库的最佳方法...这是我用来提取我现在拥有的查询
 $query = \"SELECT p.ProductName, p.price, pc.quantity, p.ProductImage, p.Features
            FROM productinfo as p
              join preconfig_categories as pc on p.ProductID = pc.product_id
              join preconfig as c on c.id = pc.category_id
              join subcategory as sc on p.SubCategoryID = sc.SubCategoryID
              WHERE  c.code      = \'{$type}_{$count}_{$class}\'
              order by sc.ordering\";
我在当前结构如下的productinfo表中想到了
CREATE TABLE `productinfo` (
  `ProductID` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) NOT NULL,
  `ProductImage` varchar(255) NOT NULL,
  `CategoryID` int(11) NOT NULL,
  `SubCategoryID` int(11) NOT NULL,
  `ProductBrief` varchar(255) NOT NULL,
  `Features` text NOT NULL,
  `Specifications` text NOT NULL,
  `Reviews` text NOT NULL,
  `Price` varchar(255) NOT NULL,
  `Status` tinyint(4) NOT NULL,
  `PartName` varchar(255) NOT NULL,
  `skip_step` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`ProductID`)
) ENGINE=MyISAM AUTO_INCREMENT=164 DEFAULT CHARSET=latin1;
我当时正在考虑添加三个额外的字段
class 
product1
product2
所以基本上我可以使用该类来告诉当前产品是什么,然后使用其他两个字段product1和product2来获取其他两个产品的ProductID。...似乎可以使用,但我感觉可能更好的解决方案然后可以更好地工作....任何想法的输入将不胜感激     
已邀请:
我建议在一张桌子上列出产品信息。第二张表列出了产品的类别(标准,商务,高级),然后在第三张表中将客户的购买映射到产品信息ID和产品类别ID。 因此,如果您将来需要添加新的产品类别(免费软件,Premium Deluxe等),只需将其添加到“产品类”表中,然后就可以在映射表中进行映射。 因此,当客户购买产品时,您可以在映射表中映射产品ID和产品类别ID。如果他们降级,则您更新映射表以立即将产品ID映射到降级的产品类ID。     
几个问题... 如果显示的产品是标准产品,是否仅显示商务和高级产品?如果产品已经是最低的了,它是否仅显示升级……而如果是高级产品,则仅显示降级?如果不是,为了始终显示一个升级和一个降级,它是否显示了不同的产品类别? 如何确定哪些产品是其他产品的替代产品?这是通过程序确定的,还是有人只是手动选择关联的产品? 如果可以通过逻辑确定关联的产品,我认为不考虑在产品表中添加额外字段,而是通过查询按需解决关联是值得考虑的。原因是,如果要更改产品的某些条件(例如价格),则可能不再将其视为当前引用该产品的产品的升级或降级...,那么您将遇到数据不一致的问题。 - 编辑 - 谢谢你的回答。因此,如果手动选择产品关联,并且每个产品将只有2个关联且只有两个关联,那么您的初始设计对我来说很好(我只需确保添加FK)。但是,如果您认为某天某个产品可能具有可变数量的关联性...像一个产品只有一个替代品,而另一个产品可能具有4个替代品,那么我可以将关联性放在单独的表中。就像是...
CREATE TABLE `associatedproduct` (
  `ProductID` int(11),
  `AssociatedProductID` int(11)
)
这样一来,产品就必须具有两个准确的关联,这将不会一成不变。您还可以在此表中添加其他列,以描述两种产品之间的关联...例如产品“ A”是升级,而产品“ B”是高级升级。     

要回复问题请先登录注册