4

添加了更新 #1。请在问题末尾检查。谢谢。

朋友们,

我正在设计一个产品列表,其中包含与类别相关的类别和过滤器。我目前有一个带有静态类别的数据库模式。我必须让它们充满活力。我找不到正确的模式来使其动态化,所以我在表单中对模式进行了硬编码。我的详细工作如下。


MySQL的东西

主产品表是所有产品的索引,每个产品类别都有单独的字段。例如,考虑一辆自行车和一台电视机。这两个产品共享产品表中的公共字段:

  1. 产品编号
  2. 姓名
  3. 价格
  4. 照片
  5. 类别

当涉及到类别时,它有一些额外的字段。因此,自行车属于汽车类别,它具有以下领域:

  1. 里程
  2. 引擎类型
  3. 座椅
  4. 燃料

对于电视产品,它有自己的类别 TV,其中的字段是:

  1. 方面
  2. 视频类型
  3. 响应时间
  4. 输入选项

目前我的数据库结构如下:

DESC `Products`;
+------------+--------------+------+-----+---------+----------------+
|      FIELD |         TYPE | NULL | KEY | DEFAULT |          EXTRA |
+------------+--------------+------+-----+---------+----------------+
| Product ID |      int(11) |   NO | PRI |  (null) | auto_increment |
|       Name | varchar(255) |  YES |     |  (null) |                |
|      Price |      int(11) |  YES |     |  (null) |                |
|      Photo | varchar(255) |  YES |     |  (null) |                |
|   Category |      int(11) |  YES |     |  (null) |                |
+------------+--------------+------+-----+---------+----------------+

类别字段如下:

DESC `television`;
+---------------+--------------+------+-----+---------+-------+
|         FIELD |         TYPE | NULL | KEY | DEFAULT | EXTRA |
+---------------+--------------+------+-----+---------+-------+
|    Product ID |      int(11) |  YES |     |  (null) |       |
|    Dimensions |  varchar(25) |  YES |     |  (null) |       |
|    Video Type | varchar(255) |  YES |     |  (null) |       |
| Response Time |  varchar(25) |  YES |     |  (null) |       |
| Input Options |         text |  YES |     |  (null) |       |
+---------------+--------------+------+-----+---------+-------+

DESC `automobiles`;
+-------------+--------------+------+-----+---------+-------+
|       FIELD |         TYPE | NULL | KEY | DEFAULT | EXTRA |
+-------------+--------------+------+-----+---------+-------+
|  Product ID |      int(11) |  YES |     |  (null) |       |
|     Mileage |      int(11) |  YES |     |  (null) |       |
| Engine Type | varchar(255) |  YES |     |  (null) |       |
|      Seater |      int(11) |  YES |     |  (null) |       |
|        Fuel | varchar(255) |  YES |     |  (null) |       |
+-------------+--------------+------+-----+---------+-------+

当我将数据插入数据库时​​,我使用这种方式:

INSERT INTO `television`
    (`Product ID`, `Dimensions`, `Video Type`, `Response Time`, `Input Options`)
VALUES
    (1, 100, 'hd', 2, 'hd');
INSERT INTO `automobiles`
    (`Product ID`, `Mileage`, `Engine Type`, `Seater`, `Fuel`)
VALUES
    (1, 100, 'hd', 2, 'hd');

HTML / PHP

对于一组静态类别似乎很好,我使用如下简单的形式。

电视

<form action="new.php">
    <ul>
        <li>
            <label>Name</label>
            <input type="text" />
        </li>
        <li>
            <label>Price</label>
            <input type="text" />
        </li>
        <li>
            <label>Photo</label>
            <input type="text" />
        </li>
        <li>
            <label>Category</label>
            <input type="text" />
        </li>
        <li>
            <label>Dimensions</label>
            <input type="text" />
        </li>
        <li>
            <label>Video Type</label>
            <input type="text" />
        </li>
        <li>
            <label>Response Time</label>
            <input type="text" />
        </li>
        <li>
            <label>Input Options</label>
            <input type="text" />
        </li>
        <li>
            <input type="submit" />
        </li>
    </ul>
</form>

汽车

<form action="new.php">
    <ul>
        <li>
            <label>Name</label>
            <input type="text" />
        </li>
        <li>
            <label>Price</label>
            <input type="text" />
        </li>
        <li>
            <label>Photo</label>
            <input type="text" />
        </li>
        <li>
            <label>Category</label>
            <input type="text" />
        </li>
        <li>
            <label>Mileage</label>
            <input type="text" />
        </li>
        <li>
            <label>Engine Type</label>
            <input type="text" />
        </li>
        <li>
            <label>Seater</label>
            <input type="text" />
        </li>
        <li>
            <label>Fuel</label>
            <input type="text" />
        </li>
        <li>
            <input type="submit" />
        </li>
    </ul>
</form>

我的问题

现在表单数据很简单。我只是使用表的结构插入到数据库中。我现在面临的问题是,如果类别应该是动态的怎么办?我应该如何更改我的数据库架构以使其动态化?

好的,让我定义一下我对动态的看法。当管理员想要添加新类别时,我目前所做的是,为类别创建新表单,转到 phpMyAdmin 并添加一个新表,然后将再次添加相同的插入查询和新文件。我想通过单独使用 PHP 的管理面板来做到这一点。这可行吗?我应该进行什么样的架构更改?


更新#1

首先。谢谢!现在我以这种方式即兴创作了我的桌子。现在我有四张桌子。

  1. 产品- 所有产品的索引。
  2. 类别-名副其实?包括类别名称及其父级。
  3. 属性- 包括类别的属性名称。
  4. 关联- 、 及其值的Product ID关联Attribute ID

现在,好吧,我正在努力。这看起来很有希望。将等待答案,同时也更新我的工作!:) 谢谢。

4

2 回答 2

4

我认为您需要更改数据库架构。在这里,我可以看到这些类别是具有第 n 级的其他父类别的子类别。并且子类别也有不同的值字段。为此,您可能需要自定义字段管理,以使这些字段也动态。所以总的来说,我的建议模式如下。

产品

Product_ID, Name, Price, Photo, Category_ID (forignkey of category table)

类别

Category_ID, Name, Parent_ID

类别_字段

Category_Field_ID, Category_ID, Name, Type

Product_Category_Field_Value

ID, Product_ID, Category_ID, Category_Field_ID, Value

因此,在 Product 表中,我们按 Category_ID 映射类别。在类别表中,我们通过 parent_ID 维护子类别。这意味着如果类别是根类别,则在 parent_ID 中使用 0,否则使用其父类别的 Category_ID。在 Category_Field 中使用与类别关联的自定义字段名称。这里的 type 是字段或数据的类型,例如你可以在 type 中使用的 text、textarea、select、radio 等。Product_Category_Field_Value 用于每个产品的自定义字段的值。使用它会起作用。祝一切顺利。

于 2013-06-11T04:33:34.847 回答
1

您应该有一个用于过滤器的表,而不是为类别类型创建一个单独的表。过滤器将具有名称/值,并且是类别的子集。现在,假设一个产品只能属于一个类别,因为这样可以简化事情。

Product (proID, fields, catID)
Categories (catID, catName)
Filters (filID, catID, filterName)
ProductFilters (proID, filID)

automobile您可以使用和填充类别TV。无论你选择什么品类,一个产品只能对应其中一个,所以你应该尽量笼统。然后,您可以提前设置类别的过滤器(mileagefuel等)。

必须在应用程序端而不是模式上强制执行针对类别的正确过滤器。

最后,产品和过滤器之间的链接允许您为单个过滤器名称(mileage值、fuel值、值等)设置值。您可以检查catID以确认所有相应的过滤器名称都已计算在内,并且任何ProductFilters带有错误 catID 的条目都被忽略。

您也可以Categories完全消除并仅使用过滤器、产品及其映射,但是您不会对产品的可能过滤器进行额外检查。

于 2013-06-11T04:23:48.317 回答