phenalor Skrevet 20. november 2010 Del Skrevet 20. november 2010 Heyhey, er relativt ny i MySQL og har et par spørsmål angående optimalisering. Jeg vet at en del av det jeg spør om sikkert er uvesentlig men jeg liker å danne meg gode vaner i et språk når jeg først går inn for å lære det vil også bare nevne at jeg har søkt en del etter dette men ikke funnet så mange svar. +------+ |user | +------+ |id | |name | |groups| +------+ der groups er en VARCHAR med gruppenavn/id (alt etter som) VS. +------+ +------+ |user | |group | +------+ +------+ |id |---. |id | |name | '----|userId| +------+ +------+ Jeg ser dette som et mye mer logisk valg, men da 'group' vil bli brukt for å angi rettigheter til forskjellige deler av siden (har tenkt over en access kolonne men en som er admin på en del har har feks. ikke engang tilgang til en annen del). problemet oppstår (i hodet mitt vel og merke) når det er en side alle skal ha tilgang til. 'group' tabellen blir jo med ett mye større enn 'user' tabellen. derfor tenker jeg at tilfelle 1. er bedre på den måte at jeg kan angi feks: bare angi "all" i 'groups' og behandle dette i php deretter. (de fleste delene skal jo alle ha tilgang til, bortsett fra noen få) hvilken metode blir sett på som mest riktig? i det andre tilfellet har jeg tabell "comment" som gjerne skulle kunne referert til andre tabeller. akkurat nå bruker jeg INT parentId og ENUM parentType, og kjører to spørringer (en som henter ut feks. innlegget og en som henter ut tilhørende kommentarer, etter ENUM). For meg ser også dette litt "grisete" ut, så det jeg lurer på er vel egentlig og det finnes noen "penere" og mer riktig måte å gjøre dette på. fant en særs neat side for å mekke ER diagrammer (samt eksportere SQL) en klikkert dersom noen gidder prøve den er xml her: <?xml version="1.0" encoding="utf-8" ?> <!-- SQL XML created by WWW SQL Designer, http://code.google.com/p/wwwsqldesigner/ --> <!-- Active URL: http://ondras.zarovi.cz/sql/demo/ --> <sql> <datatypes db="mysql"> <group label="Numeric" color="rgb(238,238,170)"> <type label="Integer" length="0" sql="INTEGER" re="INT" quote=""/> <type label="Decimal" length="1" sql="DECIMAL" re="DEC" quote=""/> <type label="Single precision" length="0" sql="FLOAT" quote=""/> <type label="Double precision" length="0" sql="DOUBLE" re="DOUBLE" quote=""/> </group> <group label="Character" color="rgb(255,200,200)"> <type label="Char" length="1" sql="CHAR" quote="'"/> <type label="Varchar" length="1" sql="VARCHAR" quote="'"/> <type label="Text" length="0" sql="MEDIUMTEXT" re="TEXT" quote="'"/> <type label="Binary" length="1" sql="BINARY" quote="'"/> <type label="Varbinary" length="1" sql="VARBINARY" quote="'"/> <type label="BLOB" length="0" sql="BLOB" re="BLOB" quote="'"/> </group> <group label="Date & Time" color="rgb(200,255,200)"> <type label="Date" length="0" sql="DATE" quote="'"/> <type label="Time" length="0" sql="TIME" quote="'"/> <type label="Datetime" length="0" sql="DATETIME" quote="'"/> <type label="Year" length="0" sql="YEAR" quote=""/> <type label="Timestamp" length="0" sql="TIMESTAMP" quote="'"/> </group> <group label="Miscellaneous" color="rgb(200,200,255)"> <type label="ENUM" length="1" sql="ENUM" quote=""/> <type label="SET" length="1" sql="SET" quote=""/> <type label="Bit" length="0" sql="bit" quote=""/> </group> </datatypes><table x="250" y="120" name="user"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <row name="name" null="1" autoincrement="0"> <datatype>VARCHAR(30)</datatype> <default>NULL</default></row> <row name="groups" null="1" autoincrement="0"> <datatype>VARCHAR(100)</datatype> <default>NULL</default></row> <key type="PRIMARY" name=""> <part>id</part> </key> </table> <table x="390" y="120" name="user"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <row name="name" null="1" autoincrement="0"> <datatype>VARCHAR(30)</datatype> <default>NULL</default></row> <key type="PRIMARY" name=""> <part>id</part> </key> </table> <table x="510" y="120" name="group"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <row name="userId" null="1" autoincrement="0"> <datatype>INTEGER</datatype> <default>NULL</default><relation table="user" row="id" /> </row> <key type="PRIMARY" name=""> <part>id</part> </key> </table> <table x="250" y="330" name="comment"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <row name="parentId" null="1" autoincrement="0"> <datatype>INTEGER</datatype> <default>NULL</default><relation table="article" row="id" /> <relation table="event" row="id" /> <relation table="comment" row="id" /> </row> <row name="parentType" null="1" autoincrement="0"> <datatype>ENUM('article','event','comment')</datatype> <default>NULL</default></row> <key type="PRIMARY" name=""> <part>id</part> </key> <key type="INDEX" name=""> <part>parentId</part> </key> </table> <table x="460" y="420" name="article"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <key type="PRIMARY" name=""> <part>id</part> </key> </table> <table x="460" y="300" name="event"> <row name="id" null="1" autoincrement="1"> <datatype>INTEGER</datatype> <default>NULL</default></row> <key type="PRIMARY" name=""> <part>id</part> </key> </table> </sql> takker på forhånd for alle svar mvh phenalor Lenke til kommentar
BlueEAGLE Skrevet 20. november 2010 Del Skrevet 20. november 2010 (endret) Så lenge du har en én til mange-relasjon hvor én bruker har mulighet til å være medlem av mange forskjellige grupper så er riktig oppsett etter min mening +-------+ +-------------+ +-------+ | user | | memberships | | group | +-------+ +-------------+ +-------+ | ID |-----| user_id | .--| ID | | name | | group_id |--' | name | | email | +-------------+ +-------+ +-------+ Endret 20. november 2010 av BlueEAGLE Lenke til kommentar
quantum Skrevet 20. november 2010 Del Skrevet 20. november 2010 Så lenge du har en én til mange-relasjon hvor én bruker har mulighet til å være medlem av mange forskjellige grupper så er riktig oppsett etter min mening +-------+ +-------------+ +-------+ | user | | memberships | | group | +-------+ +-------------+ +-------+ | ID |-----| user_id | .--| ID | | name | | group_id |--' | name | | email | +-------------+ +-------+ +-------+ Du mener vel mange-til-mange? Her kan hver gruppe ha flere medlemmer og hver user være med i flere grupper. Det første forslaget til OP med bare én tabell tror jeg vi bare ser bort ifra i stillhet (:o), og det neste hvor hver gruppe kun kan ha ett medlem er ikke mye bedre (skal det gi noe mening måtte group_id ligget i user-tabellen, og ikke omvendt) Lenke til kommentar
BlueEAGLE Skrevet 20. november 2010 Del Skrevet 20. november 2010 Du mener vel mange-til-mange? Du har helt rett. Memo til selv: Ikke skriv på forum før du har fått deg kaffe. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå