Wenn es für pro Schild jeweils nur eine Chest geben kann, würde sich eine HashMap anbieten. Hier könntest du "signID" als Key und "chestID" als Value verwenden. Da in Java nur Objects in HashMaps gespeichert werden dürfen (signID und chestID aber primitive Datentypen sind), musst du beides als "Integer" speichern (also quasi die Object-Repräsentation von int). Also bspw. so:
//Mapping signID -> chestID
HashMap<Integer, Integer> storages = new HashMap<>();
//Eintrag einfügen (chestID unter signID hinterlegen)
//Beides darf vom Typ "int" sein, das wird automatisch konvertiert
storages.put(signID, chestID);
//chestID auslesen (anhand signID)
//Hier ist es besser, das Ergebnis als "Integer" zu handhaben, da es null sein kann
Integer chestID = storages.get(signID);
//Prüfen ob Eintrag vorhanden war, also chestID != null ist (ein int könnte zwar niemals
//null sein, aber ein Integer kann durchaus null sein, da es in Java ein Object ist)
//Wenn null, war keine Kiste in HashMap vorhanden
//Wenn es nicht null ist, war Kiste in HashMap vorhanden
//Storage aus World holen (auch hier wieder autom. Konvertierung)
Storage chest = plugin.getWorld().getStorage(chestID);
//Nun könntest du prüfen, ob chest null ist (kann ja sein, dass zwar was in der
//HashMap gespeichert ist, die Kiste in der Welt aber zwischenzeitlich entfernt wurde
//Kiste nicht mehr gültig, evtl. aus HashMap löschen
Display More
Wenn du Datenbankabfragen minimieren möchtest, kommt es darauf an, wann du jeweils darauf zugreifen möchtest. Entweder du lädst beim Start alle Einträge aus der Datenbank und speicherst sie in der HashMap, oder alternativ prüfst du bei jedem Aufruf deiner Funktion, ob ein Eintrag in der HashMap vorhanden ist (mit storages.containsKey(signID);). Falls nicht, könntest du anschließend die Datenbankabfrage starten und die HashMap entsprechend um den Eintrag erweitern.
Generell aber sind Datenbankaufrufe aus Performancesicht nicht ganz so schlimm (besonders wenn es nur lesender Zugriff ist). Wenn das nur sporadisch stattfindet ist das normalerweise kein Problem 
Dein Funktionsaufruf mit HashMap-Ansatz könnte aber bspw. so aussehen:
public HashMap<Integer, Integer> storages = new HashMap<>();
public Storage getChest(int signID){
//Prüfen ob signID überhaupt in HashMap eingetragen ist
if(!storages.containsKey(signID)){
//Kein Eintrag in HashMap vorhanden - Kiste evtl. aus Datenbank auslesen (siehe Fkt. unten)
int chestID = getChestIDFromDatabase(signID);
//Falls Kiste auch hier nicht vorhanden, gibt es Kiste wirklich nicht - null zurückgeben
if(chestID == -1) return null;
//Ansonsten prüfen ob Kiste existiert und ggf. eintragen
Storage chest = plugin.getWorld().getStorage(chestID);
//Wenn Kiste NICHT existiert, trotzdem signID in HashMap eintragen,
//damit wir DB-Abfrage beim nächsten Map nicht erneut durchführen
if(chest == null) storages.put(signID, null);
//...sonst chestID speichern
else storages.put(signID, chestID);
//Kiste aus HashMap auslesen
Integer chestID = storages.get(signID);
//Falls chestID null ist, wissen wir, dass Kiste nicht existiert (siehe oben)
if(chestID == null) return null;
//Ansonsten Kiste aus Welt holen
Storage chest = plugin.getWorld().getStorage(chestID);
//Falls Kiste mittlerweile nicht mehr in Welt existiert, könnten wir HashMap updaten
if(chest == null) storages.put(signID, null);
//Deine Funktion um ChestID aus DB auszulesen. Wenn Chest in DB nicht vorhanden ist,
//könntest du bspw. -1 zurückgeben
public int getChestIDFromDatabase(int signID){
Display More