Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Umfrage Datenbank Design [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Umfrage Datenbank Design


 
Apfelmus
17-02-2010, 14:56 
 
Hallo Leute,
hab eine Frage zu dem DB design.
Möchte einen Umfrage Formular erstellen.
Ca. 7 Fragen. Hier sind einige Beispiele.
Frage 1
Wie finden Sie unsere Seite:
Sehr Gut
Gut
Mittelmäßig
Schlecht.

Frage 2
Sind Sie mit unserem Support zufrieden.
Sehr Gut
Gut
Mittelmäßig
Schlecht.

Meine Frage:
Was ist besser in dem Fall eine Tabelle mit
ID Frage1, Frage2, Frage3, Frage4 etc..
Oder
Für jede Frage eine Tabelle zu erstellen?

Vielen Dank im Voraus.

 
unset
17-02-2010, 15:00 
 
Fragetabelle, Antworttabelle, Benutzertabelle.

 
Apfelmus
17-02-2010, 15:51 
 
Hallo unset,
danke für die Antwort, leider raffe ich es nicht ganz wie es am besten ist.

hab jetzt eine tabelle nach dem muster erstellt. ( Designt)

wäre das die richtige Richtung ?

CREATE TABLE `fragen` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`id_benutzer` INTEGER NOT NULL ,
`frage1` VARCHAR(100) NOT NULL ,
`frage2` VARCHAR NOT NULL ,
`frage3` VARCHAR(100) NOT NULL ,
`frage4` VARCHAR(100) NOT NULL ,
`frage5` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`id`)
) COMMENT 'hier kommen die Fragen hin';

CREATE TABLE `antworten` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`id_benutzer` INTEGER NOT NULL ,
`antwort1` INTEGER NOT NULL ,
`antwort2` INTEGER NOT NULL ,
`antwort3` VARCHAR(200) NOT NULL ,
`antwort4` VARCHAR(200) NOT NULL ,
`antwort5` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
);

CREATE TABLE `benutzer` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`ip_adresse` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
) COMMENT 'die benutzter werden einfach anonym eingetragen';

 
AmicaNoctis
17-02-2010, 16:06 
 
Nein, die einzelnen Fragen und Antworten sind keine Spalten, sondern Zeilen, also Datensätze.

Beispiel:

frage
-----
id
name

antwort
--------
id
name

benutzer
---------
id
name
email
...

fragebogen
------------
benutzer_fkey
frage_fkey
antwort_fkey

 
unset
17-02-2010, 16:06 
 
Du hast eine Tabelle, in der du die Fragen vorhältst

id frage

Du hast eine Tabelle, in der du die Antworten vorhältst

id frage_id antwort

Du hast eine Tabelle, in der du die Benutzer vorhältst

id user_token

Du hast eine Tabelle, in der du die Benutzer-Antworten vorhälst

user_id frage_id antwort_id

 
Apfelmus
17-02-2010, 16:36 
 
ok habe das jetzt von einem von Euch probiert umzusetzen.

Könnte jemand nachschauen ob es die richtige richtung ist ?
hab so was in der schule mal gehabt ( in postgreSQL ) leider alles wieder vergessen.
da war auch einiges mit dem Fremdschluessel.
ob ich das hier auch machen muss ? oder brauche ich es hier nicht ?

Das abfrage Formular wird unter mysql laufen. #

Danke im Voraus.

CREATE TABLE `fragen` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`frage` VARCHAR NOT NULL ,
PRIMARY KEY (`id`)
);

CREATE TABLE `antworten` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`fragen_id` INTEGER NOT NULL ,
`sehrgut` INTEGER NOT NULL ,
`gut` INTEGER NOT NULL ,
`mitte` INTEGER NOT NULL ,
`schlecht` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
);

CREATE TABLE `benutzer` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`neip_adresse` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
);

CREATE TABLE `benutzer_antoworten` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`benutzer_id` INTEGER NOT NULL ,
`fragen_id` INTEGER NOT NULL ,
`antworten_id` INTEGER NOT NULL ,
PRIMARY KEY (`id`)
);

 
AmicaNoctis
17-02-2010, 16:37 
 
Nochmal: Nein! ;)

Die Antworten sollen Datensätze sein. Mit einem einzelnen Feld für jede Antwort kommst du nicht weiter.

Zum Thema Fremdschlüssel: Ja, brauchst du. Die Tabelle "benutzer_antoworten" [sic!] besteht fast nur daraus.

 
Apfelmus
17-02-2010, 17:12 
 
hallo Amica,

leider verstehe ich nicht wie du das meinst ?
kannst du mir das näher erklären ?

aus meiner sicht ist die Tabelle so OK.

wass stimmt an dem Design nicht ? wo ist mein denkFehler ?

Vielen Dank im voraus

 
AmicaNoctis
17-02-2010, 17:14 
 
Dann sag doch erstmal, was du nicht verstehst. Ich kann mich nur wiederholen: Die einzelnen Antworten müssen Datensätze (=Zeilen/Rows/Entities) sein, nicht Felder (=Spalten/Attribute).

 
Apfelmus
17-02-2010, 17:42 
 
meins du das so?

CREATE TABLE `antoworten_neu` (
`id` INTEGER NOT NULL AUTO_INCREMENT ,
`id_fragen` INTEGER NOT NULL ,
`name` VARCHAR(30) NOT NULL ,
PRIMARY KEY (`id`)
);

in den Name schreibe ich später einfach rein ( sehrgut) oder (gut)
oder kann name auch integer sein 5=sehrgut, 4= gut, etc..

mir fällt nichs mehr ein.

 
AmicaNoctis
17-02-2010, 17:57 
 
meins du das so?

Ja, genau.

in den Name schreibe ich später einfach rein ( sehrgut) oder (gut)

Richtig.

oder kann name auch integer sein 5=sehrgut, 4= gut, etc..

Wenn du das willst, klar.

 
Apfelmus
17-02-2010, 18:03 
 
Super danke für die Hilfe.:danke:

 
Apfelmus
19-02-2010, 13:22 
 
ich habe leider noch eine Frage:

wozu muss ich die Tablle (benutzer_antoworten)
erstellen ?
ich meine kann ich die tabellen später nicht über join abfragen ?

den Sinn dieser tabelle (benutzer_antoworten) verstehe ich noch nichg ganz.

Vielen Dank im Voraus.

mein design sieht so aus:

CREATE TABLE IF NOT EXISTS `fragen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`frage` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `antworten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`werte` varchar(250) DEFAULT NULL,
`id_fragen` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_fragen` (`id_fragen`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;



CREATE TABLE IF NOT EXISTS `benutzer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip_adresse` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;



CREATE TABLE IF NOT EXISTS `benutzer_antoworten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_benutzer` int(11) DEFAULT NULL,
`id_antworten` int(11) DEFAULT NULL,
`id_fragen` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_benutzer` (`id_benutzer`),
KEY `id_antworten` (`id_antworten`),
KEY `id_fragen` (`id_fragen`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;




ALTER TABLE `antworten`
ADD CONSTRAINT `antworten_ibfk_1` FOREIGN KEY (`id_fragen`) REFERENCES `fragen` (`id`);


ALTER TABLE `benutzer_antoworten`
ADD CONSTRAINT `benutzer_antoworten_ibfk_1` FOREIGN KEY (`id_benutzer`) REFERENCES `benutzer` (`id`),
ADD CONSTRAINT `benutzer_antoworten_ibfk_2` FOREIGN KEY (`id_antworten`) REFERENCES `antworten` (`id`),
ADD CONSTRAINT `benutzer_antoworten_ibfk_3` FOREIGN KEY (`id_fragen`) REFERENCES `fragen` (`id`);

 
AmicaNoctis
19-02-2010, 13:40 
 
Die brauchst du unbedingt, sonst weißt du zwar, welche Fragen es gibt, welche Antworten es gibt und weche Benutzer es gibt, aber nicht, wer jetzt welche Frage wie beantwortet hat. Genau dafür ist die nämlich da und dort steht dann z. B. drin:


1, 1, 1, 1 (Benutzer 1 hat Frage 1 mit Antwort 1 beantwortet)
2, 1, 3, 2 (Benutzer 1 hat Frage 2 mit Antwort 3 beantwortet)
3, 2, 5, 2 (Benutzer 2 hat Frage 2 mit Antwort 5 beantwortet)


Gruß,

Amica

 
Apfelmus
19-02-2010, 16:25 
 
Hallo Amica,

vielen Dank für schnelle und einfache erklärung.


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:42 Uhr.