簡體   English   中英

動態類別的數據庫架構

[英]DB Schema for Dynamic Categories

添加了更新#1 請在問題的最后檢查。 謝謝。

朋友們,

我正在設計一個產品清單,其中包含與類別相關的類別和過濾器。 我目前有一個帶有靜態類別的數據庫模式。 我必須使它們充滿活力。 我無法找到正確的架構使其動態化,因此我在表單中對架構進行了硬編碼。 我的詳細工作如下。


MySQL的東西

主要產品表是所有產品的索引,每個類別的產品都有單獨的字段。 例如,考慮一輛自行車和一台電視。 這兩個產品共享產品表中的常見字段:

  1. 產品編號
  2. 名稱
  3. 價錢
  4. 照片
  5. 類別

當涉及到該類別時,它還有一些額外的領域。 所以,自行車屬於汽車類,它有以下領域:

  1. 里程
  2. 引擎類型
  3. 西特
  4. 汽油

對於電視產品,它有自己的類別,電視,其中的字段是:

  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 IDAttribute ID及其值的關聯。

現在,好吧,我正在努力。 這很有希望。 等待答案,同時,也要更新我的工作! :) 謝謝。

我認為您需要更改數據庫架構。 在這里,我可以看到這些類別是具有第n級別的其他父類別的子類。 而且子類別也有不同的價值領域。 為此,您可能需要自定義字段管理,以使這些字段也是動態的。 所以我的建議模式總如下。

產品

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

類別

Category_ID, Name, Parent_ID

Category_Field

Category_Field_ID, Category_ID, Name, Type

Product_Category_Field_Value

ID, Product_ID, Category_ID, Category_Field_ID, Value

所以在Product表中我們按Category_ID映射了類別。 在Category表中,我們通過parent_ID維護子類別。 這意味着如果類別是根類別,則在parent_ID中使用0,否則使用其父類別的Category_ID。 在Category_Field中,使用與類別關聯的自定義字段名稱。 這里type是字段或數據的類型,例如你可以在類型中使用的text,textarea,select,radio等。 Product_Category_Field_Value用於每個產品的自定義字段的值。 使用它會起作用。 祝一切順利。

您應該有一個過濾表,而不是為類別類型設置單獨的表。 過濾器將具有名稱/值並且是類別的子集。 現在,假設一個產品只能屬於一個類別,因為這簡化了事情。

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

您可以使用automobileTV填充類別。 無論您選擇哪種類別,產品只能與其中一種產品相對應,因此您應該盡可能地保持一般性。 然后,您有一個類別的過濾器,您可以提前設置( mileagefuel等)。

必須在應用程序端而不是模式上強制使用類別的正確過濾器。

最后,產品和過濾器之間的鏈接允許您設置各個過濾器名稱的值( mileage值, fuel ,值等)。您可以檢查catID以確認所有相應的過濾器名稱都已計入,並且任何ProductFilters條目都包含catID 。錯誤的catID被忽略。

您還可以完全刪除Categories ,並且只包含過濾器,產品及其映射,但是您無法檢查產品的可能過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM