私はしばらくの間食品レシピデータベースに取り組んできました、そして私は私のデザインについていくつかの質問を蓄積しました。これは私の最初のプロジェクトですので、何かおかしなことがあったら指摘してください。これが私がソファを持っているものです:
以下の表は、「デシリットル、リットル、ダース」などの単語のリストです。
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でそれを補うのはちょっと難しいように思われるので、私はそれで生きることができます。
任意の入力/提案を歓迎します!