Rails Best Practice - Aanhoudende adressen in PostgreSQL

De ‘hstore’ extensie implementeert het ‘hstore’ datatype voor het opslaan van sets sleutel / waarde paren

Samenvatting: een oplossing voorstellen die een consistente, performante en betrouwbare methode biedt voor het opslaan en ophalen van complexe gegevenstypen uit een SQL-database.

Applicatieplanning is een cruciale en vaak vergeten stap bij het bouwen van succesvolle webapplicaties. Het Rails-framework maakt het zo eenvoudig om een ​​applicatie te maken en op te starten dat het verleidelijk is voor ontwikkelaars om planning over te slaan en meteen door te gaan naar ontwikkeling. Het genereren van applicatiecode voordat het domein goed wordt gepland, kan echter leiden tot slordige of zelfs verkeerd ingedeelde applicaties. Overweeg bijvoorbeeld de beste methode om het veld 'adres' in een toepassing te verwerken.

Wat zit er in een adres?

Zo ziet een typisch adres eruit in de Verenigde Staten:

Adres: [
Straat: String "123 Happy Days Lane"
Plaats: String "Wonderland"
Staat: "PA" String
Rits: 10102 String
]

De waarde "Adres" bestaat uit een reeks sleutel / waarde-paren, waarbij de waarde een tekenreeks is. Het is een veelgebruikt veld om te zien in applicaties. Dus, wat is de beste manier om de waarde "Adres" in een SQL-database weer te geven? Laten we om dit uit te zoeken kijken wat andere ontwikkelaars in deze situatie doen.

Optie 1: sla de waarde in een enkel veld op als een tekenreeks, bijvoorbeeld:

Adres: “123 Happy Days Ln. Wonderland, PA 10102 ”

Dit is een slechte oplossing. Zoals we in het bovenstaande gedeelte hebben gezien, is een adres een reeks sleutel / waarde-paren. Het behandelen van het adres als elk ander scalair veld zou inconsistent zijn. Deze inconsistentie wordt duidelijk wanneer we de toepassing op enig moment in de toekomst willen uitbreiden. Stel dat we alle klanten van een bepaalde 'stad' of 'staat' willen vinden. Omdat de volledige waarde van 'Adres' in een string is geplet, is er geen gemakkelijke manier om dit te doen.

Optie 2: Verdeel de waarde 'Adres' in afzonderlijke velden en sla die velden op, bijvoorbeeld:

Straat: "123 Happy Days Ln", stad: "Wonderland", staat: "PA", postcode: "10102"

Hier hebben we onze eerdere hypothetische uitbreiding van het vinden van alle klanten van een bepaalde "stad" of "staat" opgelost. We stellen het veld 'Adres' nu echter voor als vier afzonderlijke en verschillende velden, terwijl de velden in feite moeten worden gecombineerd.

Optie 3: maak een afzonderlijke adrestabel en een externe sleutelassociatie

Verschillende blogposts en StackOverflow-antwoorden concluderen dat de beste manier om adressen in Rails op te slaan, is om een ​​afzonderlijk model en een behoren-tot-associatie te gebruiken. Op deze manier kan een gebruikers- of bedrijfsmodel veel adressen hebben en niet worden beperkt tot een enkel adres. Ook zouden de adressen correct worden opgeslagen omdat elk "Adres" -model zou bestaan ​​uit zijn sleutels en respectieve waarden. Dit is geen slechte oplossing, ervan uitgaande dat uw applicatiemodel, bijvoorbeeld 'Gebruikers', verschillende adressen vereist. Als elk model echter maar één adres nodig heeft (zoals het geval is bij de meerderheid van de mensen, een postadres), vergroot u onnodig de complexiteit van de toepassing door extra tabellen en koppelingen toe te voegen. Het is vrij eenvoudig om tabellen en associaties in Rails te genereren, wat waarschijnlijk de reden is voor deze derde optie. Een nieuwe "Adres" -tabel maken met de juiste associatie met "Gebruiker" is zo eenvoudig als: rails g model Adres straat: string stad: string staat: string zip: string gebruiker: referenties De vraag wordt dan, "is dit een beste oefenen voor uw toepassing, of is dit een eenvoudige oplossing voor een complexer probleem? "

Oplossing:

Rails / PostgreSQL is een veel voorkomende technologiestapel die wordt gebruikt bij de ontwikkeling en productie. Er is een methode om adressen in hun juiste vorm op te slaan door de ‘hstore’ extensie in te schakelen. Met deze extensie kunnen we gegevens opslaan als het type ‘hstore’ (hash store). De eerste stap is het inschakelen van de ‘hstore’ -module. Om dit te doen, schrijven we een migratie:

Wanneer we 'rails db: migreren' uitvoeren vanaf de opdrachtregel, schakelt Postgres de extensie 'hstore' in. Dit kan worden geverifieerd door het bestand schema.rb te controleren. Bovenaan het bestand zou je nu moeten zien:

 # Dit zijn extensies die moeten worden ingeschakeld om deze database te ondersteunen
enable_extension “plpgsql”
enable_extension "hstore"

Vervolgens maken we een migratie voor het gebruikersmodel:

Merk op hoe we het gegevenstype ‘hstore’ gebruiken voor het adresveld. Dit stelt ons in staat sleutel / waarde-paren op te slaan in "adres".

Terzijde: het veld ‘hstore’ kan worden gebruikt om sleutel / waarde-paren op te slaan. In dit artikel onderzoeken we een "Adres" maar het is net zo handig voor het opslaan van "Voorkeuren" of een ander hash-gegevenstype.

Dus nu hebben we een enkel veld waarvan we weten dat het gegevens kan opslaan in de vorm van, City => "Wonderland" en State => "PA". We kunnen het ‘Gebruiker’ -model en ‘Gebruikers’ -controller maken, maar hoe slaan we sleutel / waarde-paren op in een enkel databaseveld? Er is nog een andere overweging die we moeten maken, hoe kunnen we het sleutel / waarde-paar van City => "Wonderland" handhaven in het veld "adres"?

Vanuit het perspectief van de controller moeten we eerst alle parameters op de witte lijst zetten voordat ze in massa kunnen worden toegewezen. Dit gebeurt volgens de privémethode ‘user_params’, hetzelfde als elk ander databaseveld.

Door een witte lijst te plaatsen van wat onder adres kan worden toegewezen, hebben we specifieke instructies gegeven met betrekking tot de gegevens die we verwachten. Het adresveld kan een stad / waarde-paar of een staat / waarde-paar hebben, maar geen aap / waarde-paar.

In ons gebruikersformulier bieden we de juiste velden om de gegevens te verzamelen:

Het hele formulier wordt getoond voor demonstratie. Het begin en einde van het adresveld zijn echter gemarkeerd met html-opmerkingen. Merk op hoe we de formulierhulp gebruiken om velden voor het adres te maken. Elk veld komt overeen met een parameter op de witte lijst die we in de controller hebben opgegeven. Hoewel het niet relevant is voor dit artikel, is het formulier gestileerd met klassen uit de Semantic-UI-bibliotheek - wat betekent dat het responsief zal zijn en er geweldig uit zal zien!

Bovenstaand formulier weergegeven in browser

We kunnen snel een gebruiker maken en zien hoe het veld 'Adres' eruit ziet:

Het adresveld wordt opgeslagen als een hash van sleutel / waarde-paren, perfect!

In de bovenstaande afbeelding is de term "onderwerp" synoniem met "gebruiker". Zoals u kunt zien, heeft het veld "Adres" onze sleutel / waarde-paren van de controller opgeslagen zoals we hadden verwacht. Als we de waarde van de stad van een bepaalde gebruiker willen vinden, kunnen we @ user.address ['city'] gebruiken en dit zou 'Wonderland' teruggeven in ons voorbeeldgebruik.

In dit artikel hebben we de optimale methode ontdekt voor het opslaan en doorzoeken van complexe gegevenstypen in PostgreSQL via de ‘hstore’ extensie. We hebben vastgesteld dat als een best practice de eerste stappen bij het maken van een webtoepassing het plannen en verzamelen van informatie zijn. We hebben ook geleerd hoe waardevol het is om zelf informatie te ontdekken door onderzoek te doen en documentatie te lezen. Het feit dat een andere ontwikkelaar of bedrijf iets op een manier doet, betekent niet dat we blindelings moeten volgen. Het is belangrijk om de vraag 'waarom' in twijfel te trekken en onze eigen cognitieve vaardigheden te gebruiken om logisch conclusies te trekken. Ik hoop dat je dit artikel nuttig vond. Bezoek Learn2Code voor meer gratis informatie en zelfstudies over webtechnologieën.