Php 一个好的数据库模式

Php 一个好的数据库模式,php,mysql,sql,database,database-design,Php,Mysql,Sql,Database,Database Design,好的,所以我有这个问题,我需要实现…这是我的 我需要做的是,对于售出的每个产品,我需要另外两个产品,要么升级,要么降级 因此,每种产品都有三个等级:标准、商业和溢价,根据当前产品的不同,它们的价格会有所增减 因此,他们基本上是定制每个解决方案。所以我需要的是找出最好的方法来构造我的数据库…这里是我用来提取我现在拥有的查询 $query = "SELECT p.ProductName, p.price, pc.quantity, p.ProductImage, p.Features

好的,所以我有这个问题,我需要实现…这是我的

我需要做的是,对于售出的每个产品,我需要另外两个产品,要么升级,要么降级

因此,每种产品都有三个等级:标准、商业和溢价,根据当前产品的不同,它们的价格会有所增减

因此,他们基本上是定制每个解决方案。所以我需要的是找出最好的方法来构造我的数据库…这里是我用来提取我现在拥有的查询

 $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…这似乎可以工作,但我觉得可能有一个更好的解决方案,然后可以工作得更好一些…任何想法输入都会非常有用非常感谢

我建议有一张包含产品信息的表格。第二个表包含产品类别(Standard、Business、Premium),然后第三个表将客户的购买映射到产品信息ID和产品类别ID

因此,如果将来需要添加新的产品类别(免费软件、高级豪华版等),只需将其添加到产品类别表中,然后就可以在映射表中映射它

因此,当客户购买产品时,您需要在映射表中映射产品ID和产品类ID。如果他们降级,您将更新映射表,现在将产品ID映射到降级的产品类别ID。

几个问题

  • 如果展示的产品是标准的,那么它是否只是展示了业务和优质产品?如果产品已经是最低的,它只是显示升级。。。如果是溢价,是否只是显示降级?如果没有,是否显示不同类别的产品,以便始终显示一次升级和一次降级
  • 如何确定哪些产品作为其他产品的替代品?这是通过编程确定的,还是有人只是手动选择关联的产品
  • 如果可以通过逻辑确定关联的产品,我认为应该考虑不向products表添加额外的字段,而是通过查询按需解析关联。理由是,如果产品的某些标准发生变化,例如价格。。。那么它可能不再被认为是当前引用它的产品的升级或降级。。。然后就出现了数据不一致的问题

    --编辑--

    谢谢你的回答。因此,如果手动选择产品关联,并且每个产品将有2个关联,并且只有两个关联,那么您的初始设计对我来说很好(我只需确保添加FKs)。然而,如果你认为某一天产品可能会有不同数量的关联。。。就像一个产品只有一个备选方案,而另一个产品可能有4个备选方案一样,那么我可以将关联放在一个单独的表中。类似于

    CREATE TABLE `associatedproduct` (
      `ProductID` int(11),
      `AssociatedProductID` int(11)
    )
    

    这样就不会一成不变地认为一个产品必须有两个关联。您还可以在此表中添加其他列,这些列可以描述两个产品之间的关联。。。就像产品“A”是一种升级,而产品“B”是高级升级。

    所以要回答第一个问题……是的,如果产品是标准的,它将显示业务和高级,如果产品是业务的,它将显示标准和高级……是的,如果它是高级的,那么是的,它只显示降级来回答第二个问题……所以我现在有一个所有产品的csvcsv拥有所有其他产品,因此不以编程方式回答它……它们被设置在霍根先生答案的扩展中:在ProductClasses表中放置一个序列字段,以便您可以识别哪些产品是升级的,哪些是降级的。添加一个完整的“另一个”表似乎是额外的工作,但您添加额外字段的想法无法很好地扩展。正如Horgan所指出的,总有一天您几乎肯定会需要第四个产品级别。因此,假设我有一个ProductClasses表……对于ProductClasses表,哪些字段最适合这样做?我建议您有ProductClassName(Standard、Business等)和一个ProductClassId整数,不能为NULL。在映射表中,您将映射ProductClassID、ProductTypeId和客户端事务id或客户端id。