2016-06-27 5 views
2

Ich bin immer noch neu in der Programmierung, da dies mein erstes Jahr im Bereich Programmierung ist. Ich habe ein paar andere Beiträge über das Entwerfen von Stammbaum hier gelesen, aber ich habe immer noch einige Details nicht verstanden, also brauche ich deine Hilfe. durch die Art und Weise, ich benutze PHPDatenbank-Design einer Familie und wie man in die Datenbank einfügt

dies ist meine vereinfachte Version Form

// family leader 
<div id="family_leader"> 
    <input type="text" name="name[]"> 
    <input type="text" name="ic[]"> // ic is the same like SSN 
</div> 

// family member 
// here input wife or child info 
// i use javascript to clone the div so user can add how many family member they have. 
<div id="family_member"> 
    <input type="text" name="name[]"> 
    <input type="number" name="ic[]"> 
    <input type="text" name="relationship[]"> 
</div> 

und ich denke, eine Datenbank auf diese Weise machen

1. Tabelle wie folgt

sein Benutzertabelle

+--------+--------------+--------------+ 
| id |  name  |  ic  | 
+--------+--------------+--------------+ 
| id1 | John   | 9357906268 | 
+--------+--------------+--------------+ 
| id2 | Josh   | 9357222228 | 
+--------+--------------+--------------+ 

und i wi ll eine andere Tabelle

für ihre Beziehung haben

Beziehungstabelle

  • ist niemand ein Vater/Mutter zu Josh
  • Josh ein Vater John
  • ist wie

die Tabelle aussehen diese

+-------------+--------------+--------------+ 
| owner_id | family_id | relationship | 
+-------------+--------------+--------------+ 
| ic1/id1 | ic2/id2 | father  | 
+-------------+--------------+--------------+ 
| ic2/id2 | ic1/id1 | child  | 
+-------------+--------------+--------------+ 

ich mache es auf diese Weise bei alleinerziehender Mutter und ich möchten diese Daten in einem Profil seinen

sichtbar machen wie

Mann hat 1 Frau Vater 1 oder viel Kind hat Kind 1 Vater

so hat weit ist es das, was ich bekam

Familie Klasse

<?php 
/** 
* this is my family class 
*/ 
class Family 
{ 

    function __construct(argument) 
    { 
     # database construct here 
    } 

    public function getUser($_POST) 
    { 
     foreach ($_POST['name'] as $row) { 
      # this is how im going to insert the data of user into user table 
      $sql1="INSERT INTO User (name, ic) values (" $_POST[name][i]", "$_POST[ic][i]")" // e.g John, 9357906268 
     } 
    } 

    public function getRelation($_POST) 
    { 
     $sql2="INSERT INTO Relationship (owner_id, family_id, relationship) values ($_POST['ic'][i], $_POST['ic'][1], $_POST['relationship'][i])" 

     /** 
     * this is where my problem reside 
     * i don't know how to make this function 
     */ 
    } 
} 

also wie füge ich richtig in die 2. tabelle ein?

i auch im Inneren des getRelation denke ich

switch ($_POST['relation']) { 
    case 'father': 
     // in here is if Josh is a father to John then John is a child to Josh. 
     break; 

    case 'mother': 
     # code... 
     break; 

    // ... more case 

    default: 
     # code... 
     break; 
} 

oder vielleicht auch mehr Funktion in der Klasse einen Schalter Fall zu tun, schaffen?

public function isFather($value='') 
{ 
    # code... 
} 

public function isMother($value='') 
{ 
    # 
} 

das Problem ist, ich bin nicht sicher, wie die Logik innerhalb der Funktion oder Schaltergehäuse zu tun, um die Beziehung der Benutzer zu bestimmen.

und ist dies der richtige Weg der Datenbank-Design und OOP?

danke für Ihre Zeit.

Antwort

2

und ist dies die richtige Art des Datenbankentwurfs?

Kleine Korrekturen: definieren Primärschlüssel in User und verwenden Sie es in Relations.owner_id und Relations.family_id. Fügen Sie für diese 2 Spalten FOREIGN KEY-Einschränkungen hinzu.

Auch vielleicht müssen Sie das Geschlecht des Benutzers speichern, da es passieren kann, dass der family_leader eigentlich Mutter ist.

Speichern von Relations.relationship als Zeichenfolge möglicherweise Leistungsproblem, wenn Sie Millionen von Datensätzen haben, aber für eine Lernaufgabe ist es in Ordnung. In MySQL gibt es eine CHECK Constraint, die verwendet werden kann, um die Feldwerte auf eine bestimmte Liste von Strings zu begrenzen, z. CHECK relationship IN('father', 'son', 'daughter','wife','husband').

Bevor die nächste Frage zu beantworten ich ein kleines Problem in Ihrem HTML-Code beachten wollen:

dies ist meine vereinfachte Version Form

Sie sind hier, um die family_leader und family_member mischen. Es ist besser, sie trennen:

<div id="family_leader"> 
    <input type="text" name="family_leader[name]"> 
    <input type="text" name="family_leader[ic]"> // ic is the same like SSN 
</div> 

<div class="family_member"> <!-- don't use id if you're gonna duplicate this div --> 
    <input type="text" name="name[]"> 
    <input type="number" name="ic[]"> 
    <input type="text" name="relationship[]"> <!-- consider using <select> tag here to limit possible relationhips --> 
</div> 

und OOP?

Ein kleiner Hinweis: getUser und getRelation Verwendung ist nicht gut. "Get" bedeutet, dass Sie Daten von irgendwo abrufen, ohne sich zu ändern. Wenn Ihre Funktion die Daten einfügt, sollten Sie sie saveUser (und saveRelation) nennen.

Nun fragte man:

das Problem ist, ich bin nicht sicher, wie die Logik innerhalb der Funktion oder Schalter Fall zu tun, um die Beziehung der Benutzer zu bestimmen.

Ich würde empfehlen, OOP-Ansatz folgt vor: Erstellen Sie die folgende User Klasse:

<?php 

class User { 
    public $id; 
    public $name; 
    public $ic; 

    public function save() { 
     // save the user to the db and update $this->id with autogenerated id 
    } 

    public function addChild(User $child) { 
     // add to `Relations`: [$this->id, $child->id, 'father'] 
     // then add to `Relations`: [$child->id, $this->id, 'child'] 
    } 

    public function addWife(User $wife) { 
     // check if this user already has a wife and throw an Exception "Wife already exists" 
     // 
     // add to `Relations`: [$this->id, $wife->id, 'husband'] 
     // then add to `Relations`: [$wife->id, $this->id, 'wife'] 
    } 

    public function addRelative($relationship, User $relative) { 
     switch ($relationship) { 
      case 'child': 
       $this->addChild($relative); 
       break; 

      case 'wife': 
       $this->addWife($relative); 
       break; 

      default: 
       throw new Exception("Unknown relationship:" . $relationship); 
       break; 
     } 
    } 
} 

dann in der Family Klasse Verwendung folgende Funktion:

public function saveFamily() { 
    $family_leader = new User() 
    $family_leader->name = $_POST['family_leader']['name']; 
    $family_leader->ic = $_POST['family_leader']['ic']; 
    $family_leader->save(); 

    foreach ($_POST['name'] as $i => $name) { 
     $family_member = new User(); 
     $family_member->name = $name; 
     $family_member->ic = $_POST['ic'][$i]; 
     $family_member->save(); 

     try { 
      $family_leader->addRelative($_POST['relationship']['$i'], $family_member); 
     } catch (Exception $e) { 
      die ('Relationship not added:' . $e->getMessage()); 
     } 
    } 
} 
+0

ohhh Dank! Ich werde das jetzt versuchen. –

+0

verwende ich die Familienklasse auf diese Weise? '$ family = neue Familie(); \t $ family = saveFamily(); 'Wird die Klasse $ _POST bekommen? –

+0

Definiere 'saveFamily()' in 'Family' Klasse und benutze' $ family = new Family(); $ family-> saveFamily(); 'In Zukunft könntest du nach einigen schönen Techniken wie [method chaining] suchen (https://en.wikipedia.org/wiki/Method_chaining#PHP) –

Verwandte Themen