Just nu i M3-nätverket
Gå till innehåll

Fler kategorier


Wepe

Rekommendera Poster

Tänkte göra mej en liten länkdatabas och funderar på hur man gör med olika kategorier. Om man bara har en siffra för varje kategori i tabellen så kan man ju bara ha en kategori per länk. Har löst det tidigare genom att ha en kollumn i tabellen för varje kategori och markerat med ja eller nej om kategorin finns med men det blir lite knöligt om man ska lägga till kategorier via webben. Kan man på nåt sätt lägga in flera värden i samma tabellkollumn och sen plocka fram dom med sql även om det finns flera värden i samma fält? Eller är det nån som har en bättre lösning på problemet?

 

Länk till kommentar
Dela på andra webbplatser

Det bästa sättet att kombinera flera Ja/Nej värden i en kolumn är att använda binära tal. Ur dessa kan du sedan testa i ditt script om en viss kategori är vald.

Ex.

KATEGORI BINÄRT VÄRDE

Kategori1 1

Kategori2 2

Kategori3 4

Kategori4 8

 

Om kategori 2 och 4 är valda summerar du alltså 2+8=10 och sparar i kolumnen.

 

När du sen hämtar ett värde x ur denna kolumn, kan du ex. testa om Kategori3 är vald med (x AND 4)

 

Andra varianter är att spara ex. flera kategori-IDn i en kommaseparerad sträng, som du i scriptet gör om till en array för att plocka ut vilka id:n som är valda

 

- Chris

 

Länk till kommentar
Dela på andra webbplatser

Gör en speciell tabell med kategorier och en med referenser mellan.

Kategoritabellen kan vara ex.

ID KAT_NAMN

1 Datorer

2 Skoj

3 Nyheter

 

Länktabellen är då kanske:

ID LINK

1 www.idg.se

2 www.microsoft.com

3 www.skrattnet.se

4 www.aftonbladet.se

 

Om du då gör en referenstabell

rLink rKat

1 1

2 1

3 2

4 3

så ser man att både länken 1 och 2 hör till kategori 1

 

Att sedan få alla länkar som hör till ex. datorer skriver man ex. som

SELECT Link FROM Links, Kategori, Referens WHERE Links.ID = Referens.rLink AND Kategori.ID = Referens.rKat AND Kategori.Kat_Namn = 'Datorer'

 

 

/Mikke

----------------------------------------------

- Vah! Denuone Latine loquebar? Me ineptum. Interdum modo elabitur.

(Hoppsan! Pratade jag latin nu igen? Tokigt. Ibland så bara slinker det ur mig.)

 

Länk till kommentar
Dela på andra webbplatser

Men funkar den det om det finns flera alternativ som tex 2 + 8 = 10 och 4 + 6 = 10?

 

Hur skulle man göra med ett array för att ta fram komma separerade siffror?

 

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren

Jag antar att det senaste var riktat på mitt svar.

 

Men funkar den det om det finns flera alternativ som tex 2 + 8 = 10 och 4 + 6 = 10?

 

Varje alternativ kopplas mot en potens av 2, så fallet 4+6 kan inte ske, då 6 inte är en potens av 2

 

Säg att du har n st kategorier, numrerade 0 till (n-1).

För att få värdet som ska lagras summerar du de valda kategorierna så här:

 

Ex. Kategori 0,1,2,4 är valda

 

(2^0+2^1+2^2+2^4)=(1+2+4+16)=23

 

 

Hur skulle man göra med ett array för att ta fram komma separerade siffror?

 

Det här alternativet innebär att du sparar ex. ID:n från en kategoridatabas i en sträng i samma fält. Ex. "13,17,44"

 

När du hämtar strängen, gör du om den till en Array med

arrKategorier=split(strKategorier,",")

Nu har du en array med tre element, där

arrKategorier(0)=13

arrKategorier(1)=17

arrKategorier(2)=44

 

 

Jag brukar använda metoden med binära summor när jag har en fast intern representation av ett antal värden, såsom exemepelvis rättigheter:

1=READ

2=WRITE

4=EXECUTE

 

Värdet 7 skulle då innebära fullständiga rättigheter, medan värdet 1 enbart ger rättigheter till läsning.

 

Men titta även på sscmikke's förslag. Hans förslag är det teoretiskt korrekta sättet om man följer databasteorins regler. Men teorin är inte alltid det effektivaste sättet att göra det praktiskt, det beror helt på hur man i övrigt designat sitt system och hur stort det förväntas bli i datamängd räknat.

 

- Chris

 

Länk till kommentar
Dela på andra webbplatser

Det bästa sättet att kombinera flera Ja/Nej värden i en kolumn är att använda binära tal. Ur dessa kan du sedan testa i ditt script om en viss kategori är vald.

 

Om kategori 2 och 4 är valda summerar du alltså 2+8=10 och sparar i kolumnen.

 

När du sen hämtar ett värde x ur denna kolumn, kan du ex. testa om Kategori3 är vald med (x AND 4)

 

Har funderat lite på det här och kommit fram till att det måste nog vara den bästa lösningen. Nu gäller det bara att få ut värdena när man gör en sökning. Hur löser man det?

 

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren

Tester av enskilda bitvärden i ett tal måste du göra i din kod, det kan du inte göra i SQL-frågan direkt. Sen vet jag inte hur du ska använda dessa värden, men i ASP kan du t.ex testa om bit 2 (värde 4) är satt med:

 

nValue=CLng(rs("DittFält"))

If (nValue AND 4) then

' Bit 2 är satt

End If

 

Det går inte att förklara närmare om jag inte vet exakt hur du ska använda det här.

 

- Chris

 

Länk till kommentar
Dela på andra webbplatser

Det går inte att förklara närmare om jag inte vet exakt hur du ska använda det här.

Hmm det vet inte jag heller riktigt tyvärr... vet bara att jag ska ha en länkdatabas där varje länk ska kunna finnas i fler kategorier.

 

Länk till kommentar
Dela på andra webbplatser

Kan inte förstå varför ni vill kludda till det med en massa binära tal. Din databas är byggd för att hanter just det du vill och sscmikke har gett ett lyssande exempel på en många-många förhållande: Alltså en kategori kan ha många länkar, och en länk kan finnas i många kategorier.

 

Det är den enklaste och bästa varianten på det du önksar, samt det som är enklast att bygga vidare på.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Jag vill bestämt hävda att värdet 4 är 3 biten och inte andra. För inte börjar man väl att räkna första biten som 0 bit?

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Jo men om man i efterhand vill lägga till en kategori på eb länk så måste man ju kopiera länken till den nya kategorin. Och det blir en massa dubbla länkar istället för dubbla värden på samma länk.

 

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren
Jag vill bestämt hävda att värdet 4 är 3 biten och inte andra. För inte börjar man väl att räkna första biten som 0 bit?

 

Binära tal börjar med Bit 0 (vilket är första biten, så visst 3 biten = bit2 har värdet 4)

 

Länk till kommentar
Dela på andra webbplatser

Kan du inte lägga in två rader i databasen om du vill ha två kolumner och köra vidare på ssmickes förslag? då kan du ha hur många kategorier per länk som helst. Alternativt kan du lägga in kommaseparerde värden och splitta dem när du skriver ut kategorierna

 

Länk till kommentar
Dela på andra webbplatser

NEJ!

 

Om du vill ha en länk i flera olika kategorier så sätter du det i din referenstabell:

rLink rKat

1 1

2 1

3 2

4 3

4 1

4 2

 

Här har vi nu länk med ID 4 i 3 olika kategorier. Kategorierna med ID 1, 2 och 3.

 

Vill du ha den i fler kategorier så lägger man bara till fler rader i databasen.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Är du säker? Kan inte minnas att man börjar på 0 utan på 1. Det var ju ett tag sedan :(

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Tjena!

 

Binära tal börjar med Bit 0

 

Nu slänger jag in en brandfackla:

Jag skulle vilja hävda att binära tal inte har mer med bittar att göra, än decimala har med äpplen och päron.

 

Sug på den!

 

/ Johan

 

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren
Jag skulle vilja hävda att binära tal inte har mer med bittar att göra, än decimala har med äpplen och päron.

 

Nä, men du är säkert en av de som lärde sig ett högnivåspråk som första programmeringserfarenhet, så jag tycker att du ska läsa in dig innan du öppnar käften. Orkar inte ens börja argumentera mot ditt inlägg, eftersom jag vet att du inte vet vad du pratar om.

 

Sen måste jag bara säga att jag blir jävligt less på de onödiga och oprovocerade inläggen i den här tråden kring just detta, när man bara försöker ge olika tips på möjligheter att lösa ett problem åt någon. Ska ni fortsätta posta här, så lämna egna förslag istället för att tjafsa om sånt ni inte begriper er på!

 

Brandfackla? Jo, det kan man ju säga.

 

- Chris

 

Länk till kommentar
Dela på andra webbplatser

Jag ursäktar mig om mina inlägg känns provocerande, det är bara det att jag har för mig att det börjar på 1 och inte 0, men som sagt det var ett tag sedan jag sysslade med bitar och binära tal.

 

Så för att var helt med det klara så undar jag bara om du är säker på att binära tal börja på bit 0 och inte bit 1, eftersom något i mitt bakuvud säger mig tvärtom. Det är säkert så att jag har fel (hemsk tanke) och så fall vill jag ha det bekräftat.

 

Inläggen är inte menningen att provocera dig, jag skulle ju kunna leta upp informationen själv, men lat som man är (det är naturligt, bevisat på kemin) så var det enklare att få det bekräftat av dig :)

 

Angående Johan's inlägg så har han faktiskt rätt, bittar har inget med binäratal att göra, däremot så har bitar med den binäratalsystemt att göra.

 

Som man säger, det finns 10 kategorier av folk som förstår binärt, det som förstår och de som inte förstår.

 

- Magnus

-----------------------------------------------------

Ropen skalla, BBB (eller BOSTREAM) åt alla!!!

 

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren
Jag ursäktar mig om mina inlägg känns provocerande

 

Sorry om jag tog i, jag hade lite dåligt morronhumör där och kände inte för att vara på kontoret så tidigt. Nu är jag inte lika bitsk längre =)

 

Jag vet inte riktigt vilken skillnad ni gör på ett binärt tal och binära talsystemet, så där kan ni väl utveckla.

 

Att ett binärt tal börjar med bit 0 betyder bara att när biten är satt innefattar talet värdet 2^0=1

Det här kan vara en definitionsfråga som har förändrats sen jag programmerade assembler (vilket var mer än 10 år sen nu) och från den referenslitteratur jag läste då. Men det känns lättare att beskriva värdet av bit n =2^n än 2^(n-1)

 

- Chris

 

[inlägget ändrat 2003-09-03 08:57:35 av anjuna]

Länk till kommentar
Dela på andra webbplatser

Tjena!

 

Ditt dåliga morgonhumör ursäktas härmed, eftersom mitt inlägg var en produkt av motsatsen: När jag blir trött framåt kvällen tycker jag det är roligt att göra inlägg med semantiska hårklyverier. Själv tyckte jag att jag var ganska finurlig..... ;)

 

Tillåt mig förklara vad jag menade med mitt inlägg.

 

Det binära talsystemet är ju inget mer än ett talsystem, och det är bara av kulturella skäl som vi valt en bas på 10 för dagligt bruk. Rimligen har mänskligheten också känt till det binära talsystemet långt innan den första datorn uppfanns, och därför kan man inte hävda att fysiska företeelser i datavärlden skulle vara en integrerad del av något talsystem, varken binärt eller hexadecimalt....

 

En bit betraktar jag som något elektriskt, alltså fysiskt (här någonstans tar mina anspråk på tekniska kunskaper slut). Det gör även du, för när du säger att en bit är satt, så syftar du på en fysisk omständighet i en dator, som inte kan vara en förutsättning för ett talsystem, därav min analogi till äpplen och päron...

 

Om du däremt skulle hävda att en bit (binary digit) är det binära talsystemets motsvarighet till det decimala talsystemets "siffra", så är det ett väldigt intressant argument för din sak. Men jag tror att det är fel... ;)

 

Du har för övrigt rätt i att jag min första programmeringserfarenhet var ett högnivåspråk (Basic v2 från Commodore). Men det övergavs tämligen fort till förmån för maskinkod (6510). Menar du att du gick direkt på maskinkod? Det är imponerande...!

 

/ Johan

 

[inlägget ändrat 2003-09-03 10:38:46 av Nollis]

Länk till kommentar
Dela på andra webbplatser

Christopher Bergren
Tillåt mig förklara vad jag menade med mitt inlägg.

 

Jag är med på ditt resonemang nu, kring talsystem kontra tal.

 

När det gäller högnivåspråksgrejen var ju det också en del av min morgonelakhet. Fast vad jag hade i åsyfte var de som idag inleder sin bana med ASP eller VB och inte sätter sig in i grunderna, jag tycker att man förlorar värdefull insikt då.

 

Jag gick för övrigt i liknande bana som du, Basic v2 -> Asm 6510 -> Asm M68000. Använde bara maskinkod under de första åtta åren jag programmerade, sen fick jag nog. Men det utan den erfarenheten hade jag inte kodat lika effektivt idag.

 

- Chris

 

 

Länk till kommentar
Dela på andra webbplatser

Tjena!

 

Men det utan den erfarenheten hade jag inte kodat lika effektivt idag.

 

Det är värdefullt, och en erfarenhet som även jag har nytta av varje dag!

 

/ Johan

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...