Index: database/drizzle/queries/components.ts
===================================================================
--- database/drizzle/queries/components.ts	(revision 1b5c18bef56f1e5c7c01819c2ef8e8ec2b99b219)
+++ database/drizzle/queries/components.ts	(revision adc31efc1b4507b5b3a779e6190ce32df4c108a5)
@@ -271,4 +271,7 @@
         networkAdapters: existingComponents.filter(c => c.type === 'network_adapter'),
         soundCards: existingComponents.filter(c => c.type === 'sound_card'),
+        memoryCards: existingComponents.filter(c => c.type === 'memory_card'),
+        opticalDrives: existingComponents.filter(c => c.type === 'optical_drive'),
+        cables: existingComponents.filter(c => c.type === 'cables')
     };
 
@@ -277,5 +280,6 @@
         ...existing.networkCards,
         ...existing.networkAdapters,
-        ...existing.soundCards
+        ...existing.soundCards,
+        ...existing.memoryCards
     ].reduce((sum: number, c: any) => {
         if (!c) return sum;
@@ -319,5 +323,12 @@
         case 'network_adapter':
         case 'sound_card':
+        case 'memory_card':
             compatibleComponents = await getCompatiblePCIeComponents(db, existing, componentType, pciExpressSlotsUsed, limit, sortCondition);
+            break;
+        case 'optical_drive':
+            compatibleComponents = await getCompatibleOpticalDrives(db, existing, limit, sortCondition);
+            break;
+        case 'cables':
+            compatibleComponents = await getCompatibleCables(db, limit, sortCondition);
             break;
         default:
@@ -920,4 +931,12 @@
             };
             break;
+        case 'memory_card':
+            table = memoryCardsTable;
+            selectFields = {
+                ...selectFields,
+                numSlots: memoryCardsTable.numSlots,
+                interface: memoryCardsTable.interface,
+            };
+            break;
         default:
             return [];
@@ -945,4 +964,62 @@
 
     return components;
+}
+
+async function getCompatibleOpticalDrives(db: Database, existing: any, limit?: number, sortCondition?: any) {
+    if (existing.opticalDrives && existing.opticalDrives.length > 0) {
+        return [];
+    }
+
+    return db
+        .select({
+            id: componentsTable.id,
+            name: componentsTable.name,
+            brand: componentsTable.brand,
+            price: componentsTable.price,
+            imgUrl: componentsTable.imgUrl,
+            type: componentsTable.type,
+            driveType: opticalDrivesTable.type,
+            formFactor: opticalDrivesTable.formFactor,
+            interface: opticalDrivesTable.interface,
+            writeSpeed: opticalDrivesTable.writeSpeed,
+            readSpeed: opticalDrivesTable.readSpeed
+        })
+        .from(componentsTable)
+        .innerJoin(
+            opticalDrivesTable,
+            eq(componentsTable.id, opticalDrivesTable.componentId)
+        )
+        .where(
+            eq(componentsTable.type, 'optical_drive')
+        )
+        .orderBy(
+            sortCondition
+        )
+        .limit(limit || 100);
+}
+async function getCompatibleCables(db: Database, limit?: number, sortCondition?: any) {
+    return db
+        .select({
+            id: componentsTable.id,
+            name: componentsTable.name,
+            brand: componentsTable.brand,
+            price: componentsTable.price,
+            imgUrl: componentsTable.imgUrl,
+            type: componentsTable.type,
+            lengthCm: cablesTable.lengthCm,
+            cableType: cablesTable.type
+        })
+        .from(componentsTable)
+        .innerJoin(
+            cablesTable,
+            eq(componentsTable.id, cablesTable.componentId)
+        )
+        .where(
+            eq(componentsTable.type, 'cables')
+        )
+        .orderBy(
+            sortCondition
+        )
+        .limit(limit || 100);
 }
 
