2016-06-20 6 views
1

Ich habe Interesse an mehrere Werte in einer einzigen Spalte zu speichern, anstatt die traditionellen many-to-many verwenden Tabelle:Wie durch Kraft der Schlüsselwerte zu erhöhen, zwei

class Beer 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, String 
    property :containers, Integer # use bit arithmetic to store multiple values 

    validates_presence_of :name, :containers 

end 

class Container 
    include DataMapper::Resource 

    property :id, Serial # increment in powers of two? 
    property :name, String 
    property :volume, Integer 

    validates_presence_of :name, :volume 

end 

Container:

ID Name Volume Unit 
1 Growler 64  oz 
2 Cowler 32  oz 
4 Bomber 750  mL 
8 Six-fifty 650 mL 
16 4 pack 64  oz 
32 6 pack 72  oz 

Beers:

ID Name Containers 
1 LSD 72 
2 Düo 16 

gibt es eine einfache Möglichkeit, eine DataMapper Ressource zu erhöhen serielle Werte in Potenzen zu konfigurieren o f 2? Ich gehe davon aus, dass der Verein eine Herausforderung sein wird.

+1

Welchen Vorteil könnte das haben? –

+0

Eine weniger zu wartende Tabelle. Bitweise Abfragen sind schnell und leistungsstark. Das heißt, ich brauche wahrscheinlich eine Hilfsfunktion in der Ansicht, um 'Container' in seine String-Darstellung zu konvertieren. – craig

+0

Alles über das Einrichten für einen Fehler. Tu das nicht. Verwenden Sie fortlaufende Nummern und eine geeignete relationale Tabelle. Sie gehen hier auf die schlimmste Weise gegen den Strom und es wird ein ständiger Kampf sein, die Dinge auf Kurs zu halten. Denken Sie daran, Postgres hat eine 'ARRAY'-Spalte und MySQL und Postgres unterstützen beide' JSON', wenn Sie eine beliebige Datenstruktur benötigen. – tadman

Antwort

2

Sie können nicht tun, mit Serial Objekttyp, aber Sie einen Integer und einen before :create Haken verwenden:

class Container 
    include DataMapper::Resource 

    property :id, Integer, key: true # Use whatever options you like 
    property :name, String 
    property :volume, Integer 

    validates_presence_of :name, :volume 

    # Create a new id based on the last element 
    before :create do |c| 
    last_container = Container.last 
    # If integer has N bits, then you can only store N containers in your database (normally, 32 or 64 bits). 
    c.id = last_container ? (last_container.id * 2) : 1 
    end 
end 

Anyways, sollten Sie das relationale Modell sein, daß anstelle der Verwendung dieser hacky- Tricks, als jemand bereits auf Ihren Beitrag kommentiert. Es ist viel wartungsfreundlicher, einfacher zu lesen und einfacher als diese Art von Lösungen.


Oh, übrigens, wenn Sie einen schnellen Zugriff auf die Datenbank benötigen, sollten Sie einen Blick auf Graph databases und neo4jrb überprüfen, eine OGM für Neo4j.

+0

Ziemlich glatte Lösung. Ich werde wahrscheinlich die "Standard" Route gehen, wie jeder vorschlägt. – craig

+0

@craig Dann machst du, mein Herr, Recht:] – Wikiti

Verwandte Themen