私はサードパーティのデータベースへのアクセス権を与えられており、その情報を使用してツールを作成したいと考えています。本来の目的のために設計されたデータベースは非常に大きく、分離されています。次のタスクを完了する必要があります。
以下のスキーマから、次のタスクを完了する必要があります。
invTypes でアイテムを検索し、invTypeMaterials と ramTypeRequirements の両方をチェックして、アイテムを構築するために必要な材料があるかどうかを確認します。はいの場合は、invTypes でこれらの各マテリアルを検索し、プロセスを繰り返して、コンポーネントが必要かどうかを確認します。このループは、invTypeMaterials と ramTypeRequirements の両方のチェックが False になるまで続きます。これは 5 回または 6 回のループになる可能性がありますが、チェックするループごとに 5 回または 6 個の項目があるため、元の項目に対して 1 回のループを想定すると、1561 回のループになる可能性があります。 5、5回ある素材。
今、私はコードを完成させようとしましたが、次のことを思いつきました:
$materialList = array();
function getList($dbc, $item) {
global $materialList;
// Obtain initial material list
$materials = materialList($dbc, $item);
// For each row in the database
while ($material == mysqli_fetch_array($materials)) {
// Check if there are any sub materials required
if (subList($dbc, $material['ID'])) {
// If so then recurse over the list the given quantity (it has already done it once)
for ($i = 0; $i < $material['Qty'] - 1; $i++) {
if (!subList($dbc, $material['ID'])) {
break;
}
}
} else {
// If there are no further materials then this is the base material so add to the array.
$materialList .= array(
"Name" => $mMaterial['Name'],
"Qty" => $mMaterial['Qty'],
"ID" => $material['ID']
);
}
}
return $materialList;
}
function subList($dbc, $item) {
global $materialList;
// Query the material incase it require further building
$mMaterials = materialList($dbc, $item['ID']);
// If the database returns any rows, then it must have more sub-materials required
if (mysqli_num_rows($mMaterials) > 0) {
// Check the sub-materials to see if they intern require futher materials
if (subList($dbc, $material['ID'])) {
// If the function returns true then iterate over the list the given quantity (its already done it once before)
for ($i = 0; $i < $material['Qty'] - 1; $i++) {
if (!subList($dbc, $material['ID'])) {
break;
}
}
} else {
// if the database returns 0 rows then this object is the base material so add to array.
$materialList .= array(
"Name" => $mMaterial['Name'],
"Qty" => $mMaterial['Qty'],
"ID" => $material['ID']
);
return true;
}
} else {
return false;
}
}
function materialList($dbc, $item) {
// Query
$query = " SELECT i.typeID AS ID, i.typeName AS Name, m.Quantity AS Qty
FROM invTypes AS i
LEFT JOIN invTypeMaterials AS m
ON m.materialTypeID = i.typeID
LEFT JOIN ramTypeRequirements AS r
ON r.typeID = i.typeID
WHERE groupID NOT IN(278,269,278,270,268) AND m.typeID = $item";
$snippets = mysqli_query($dbc, $query) or die('Error: ' . mysqli_error($dbc));
return $snippets;
}
再帰的なデータベース呼び出しに関しては、このコードがすべてのプログラミング法則に違反していることに気付いたと確信しています。subList()
特に、それが偽であることが判明するまで継続的に自分自身を呼び出すという点で、実際には実用的ではありません。SQL は私の強力なスイートではありませんが、一生この問題を解決する方法を見つけることはできません。
どんなポインタでも非常に役に立ちます。コード全体を書き直すように頼んでいるわけではありませんが、何を考慮すべきかについて何かアイデアがあれば、感謝します.