Gå til innhold

SQL Normalisering - optimaliserng


Anbefalte innlegg

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
Videoannonse
Annonse

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 av BlueEAGLE
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...