1

私はしばらくの間食品レシピデータベースに取り組んできました、そして私は私のデザインについていくつかの質問を蓄積しました。これは私の最初のプロジェクトですので、何かおかしなことがあったら指摘してください。これが私がソファを持っているものです:

以下の表は、「デシリットル、リットル、ダース」などの単語のリストです。

CREATE TABLE amount_type(
    amount_type_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    amount_type VARCHAR(40) NOT NULL,
    PRIMARY KEY (amount_type_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

以下は、レシピ名、説明:「古き良きパンケーキ」、すべての指示「フライパンに卵、小麦粉、ミルクを追加する」、および作成された食品の量を追跡します。

CREATE TABLE recipe(
    recipe_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    description VARCHAR(100) NOT NULL,
    instruction VARCHAR (250) NOT NULL,
    amount SMALLINT(10) UNSIGNED NOT NULL,
    amount_type_id INT(10) UNSIGNED NOT NULL,   
    last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (amount_type_id) REFERENCES amount_type (amount_type_id),
    PRIMARY KEY (recipe_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

各成分は「野菜、乳製品」のような種類に属します

CREATE TABLE ingredient_type(
    ingredient_type_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    type VARCHAR(40) NOT NULL,
    PRIMARY KEY (ingredient_type_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

どの会社が材料を生産しましたか:

CREATE TABLE ingredient_brand(
    ingredient_brand_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    brand_name VARCHAR(40) NOT NULL,
    PRIMARY KEY (ingredient_brand_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

成分名、成分の説明、unit_priceは製品に応じてリットル/キロあたり、一時的な割引価格です。

CREATE TABLE ingredient(
    ingredient_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    ingredient_type_id INT(10) UNSIGNED NOT NULL,
    name VARCHAR(40) NOT NULL,
    description VARCHAR(40) NOT NULL,
    ingredient_brand_id INT(10) UNSIGNED NOT NULL,
    unit_price DECIMAL(9,4) UNSIGNED NOT NULL,
    unit_discount_price DECIMAL(9,4) UNSIGNED NOT NULL,
    unit_discount_expire_date DATE NOT NULL,
    last_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (ingredient_type_id) REFERENCES ingredient_type (ingredient_type_id),
    FOREIGN KEY (ingredient_brand_id) REFERENCES ingredient_brand (ingredient_brand_id),
    PRIMARY KEY (ingredient_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

レシピと材料の関係テーブル。各レシピの材料の量も追跡します。

CREATE TABLE recipe_to_ingredient(
    recipe_id INT(10) UNSIGNED NOT NULL,
    ingredient_id INT(10) UNSIGNED NOT NULL,
    amount DECIMAL(9,2) UNSIGNED NOT NULL, 
    amount_type_id INT(10) UNSIGNED NOT NULL,
    FOREIGN KEY (recipe_id) REFERENCES recipe (recipe_id),
    FOREIGN KEY (ingredient_id) REFERENCES ingredient (ingredient_id),
    FOREIGN KEY (amount_type_id) REFERENCES amount_type (amount_type_id),
    PRIMARY KEY (recipe_id, ingredient_id)
)
ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci;

さて、質問です。水道水のようないくつかの成分は、ブランドや特定の価格に属していません。また、その時点で利用できないために、割引価格や割引日も保存されない場合があります。

どのように対処しますか?設計に問題がありますか?「未定義」のような値を保存する必要があります。それらのフィールドをnullにする必要がありますか?価格に関して言えば、ほとんどの製品(99%以上)はおそらく結局のところ価格があります。

必要なのが2デシリットルだけの場合、最も安い材料が5リットルの容器である可能性があるという問題もあります。しかし、ATMでそれを補うのはちょっと難しいように思われるので、私はそれで生きることができます。

任意の入力/提案を歓迎します!

4

1 に答える 1

1

水の価格は(少なくとも最初の世界では)わかっているので、NULLよりも$0.00を使用します。この列に基づいて別のテーブルに結合していないため、値とNULLが混在していても問題はありません。

この列に基づいて参加したいので、component_brandは難しくなります。実際にはブランドがないので、NULLを使用します(したがって、OUTER JOINが必要です)。

まとめて購入する場合は、プロファイルでそれを許可するオプションをユーザーに与えることができます(「x%節約できれば...」)。また、まとめて購入する前に、製品の保管寿命が長いかどうかを確認することもできます。

幸運を。

于 2012-10-04T21:04:30.367 に答える