単純に言えばXAMPPのMySQLで料理テーブルをつくり正規化すればいいのですが、レシピサイトなどのメニューと違って、家庭料理の場合おなじ料理名でも材料は毎回違うということです。
そういう場合、「もやしとカニカマの中華風サラダ」に対して「もやし」と「カニカマ」を必須材料とし、「きゅうり」を任意材料とするなどの工夫が必要です。またバリエーション「もやしとカニカマの和風サラダ」や「もやしとカニカマのフレンチ風サラダ」があるなら料理名は「もやしとカニカマのサラダ」などにしてバリエーションを確保したほうがよいです。
いずれにしても現在は要求定義といってどういう機能がほしいか洗い出しをするタイミングだと思うので、仕様のパターンをあげていき、具体的な素材をサンプリングして仮組みしてみることが肝要です。その段階が一通りおわったら要件定義という具体的にシステムにどう落とし込み、どの機能が必要で、どの仕様はカットするかを決め込む段階に移ります。
参考
ざっくりこんなテーブル構成が必要になります
SQL
1create table cate(
2cid int primary key,
3cname varchar(100));
4insert into cate values
5(3001,'サラダ'),
6(3002,'炒めもの'),
7(3003,'煮物'),
8(3004,'揚げ物'),
9(3005,'副菜');
10
11create table genre(
12gid int primary key,
13gname varchar(100));
14insert into genre values
15(4001,'魚'),
16(4002,'肉'),
17(4003,'野菜'),
18(4999,'その他');
19
20create table menu(
21mid int primary key,
22cid int null,
23gid int null,
24mname varchar(100),
25foreign key (cid) references cate(cid)
26on update cascade on delete set null,
27foreign key (gid) references genre(gid)
28on update cascade on delete set null
29);
30
31insert into menu(mid,cid,gid,mname) values
32(1001,3003,4001,'魚の煮付け'),
33(1002,3001,4003,'ほうれん草とコーンのソテー'),
34(1003,3003,4003,'里芋煮'),
35(1004,3001,4999,'マカロニサラダ'),
36(1005,3002,4003,'八宝菜'),
37(1006,3004,4999,'春巻'),
38(1007,3001,4003,'もやしとかにかまの中華サラダ'),
39(1008,3003,4003,'かぼちゃ煮'),
40(1009,3002,4003,'小松菜炒め'),
41(1010,3005,4003,'しそ昆布');
42
43create table ingre(
44iid int primary key,
45iname varchar(100));
46insert into ingre values
47(2001,'魚'),
48(2002,'ほうれん草'),
49(2003,'コーン'),
50(2004,'里芋'),
51(2005,'厚揚げ'),
52(2006,'いんげん'),
53(2007,'マカロニ'),
54(2008,'にんじん'),
55(2009,'きゅうり'),
56(2010,'卵'),
57(2011,'豚肉'),
58(2012,'玉ねぎ'),
59(2013,'ピーマン'),
60(2014,'しいたけ'),
61(2015,'きくらげ'),
62(2016,'白菜'),
63(2017,'春巻き'),
64(2018,'レタス'),
65(2019,'もやし'),
66(2020,'かにかま'),
67(2021,'かぼちゃ'),
68(2022,'丸天'),
69(2023,'小松菜'),
70(2024,'ベーコン'),
71(2025,'しそ昆布');
72
73create table menu_ingres(
74miid int primary key auto_increment,
75mid int null,
76iid int null,
77foreign key (mid) references menu(mid)
78on update cascade on delete set null,
79foreign key (iid) references ingre(iid)
80on update cascade on delete set null
81);
82
83insert into menu_ingres(mid,iid) values
84(1007,2019),
85(1007,2020),
86(1007,2009);
87
88create table daily_menu(
89did int primary key auto_increment,
90d date not null,
91term enum('朝食','昼食','夕食') not null,
92mid int,
93foreign key (mid) references menu(mid)
94on update cascade on delete set null
95);
96insert into daily_menu(d,term,mid) values
97('2023-03-27','夕食',1005),
98('2023-03-27','夕食',1006),
99('2023-03-27','夕食',1007);
UIとしてはメニュー追加ボタンを押すとモーダルダイアログが開いて、カテゴリーやジャンルを選んで検索ボタンをおした結果からメニューを選択し、メニューに紐づく材料を、menu_ingreテーブルを利用して抽出します