it-swarm.com.de

Implementierungssystem mit MySQL implementieren

Ich weiß, dass dies gefragt wurde hier und hier , aber ich habe die gleiche Idee mit einer anderen möglichen Implementierung und brauche Hilfe.

Anfangs hatte ich meine blogstories Tabelle mit dieser Struktur:

| Column    | Type        | Description                                    |
|-----------|-------------|------------------------------------------------|
| uid       | varchar(15) | 15 characters unique generated id              |
| title     | varchar(60) | story title                                    |
| content   | longtext    | story content                                  |
| author    | varchar(10) | id of the user that originally wrote the story |
| timestamp | int         | integer generated with microtime()             |

Nachdem ich beschlossen hatte, für jede Story im Blog ein Versionsverwaltungssystem zu implementieren, fiel mir als Erstes ein, eine andere Tabelle für Änderungen zu erstellen. Danach dachte ich, ich könnte die vorhandene Tabelle so ändern, dass sie Versionen anstelle von Änderungen enthält. Dies ist die Struktur, die mir in den Sinn kam:

| Column        | Type          | Description                                       |
|------------   |-------------  |------------------------------------------------   |
| story_id      | varchar(15)   | 15 characters unique generated id                 |
| version_id    | varchar(5)    | 5 characters unique generated id                  |
| editor_id     | varchar(10)   | id of the user that commited                      |
| author_id     | varchar(10)   | id of the user that originally wrote the story    |
| timestamp     | int           | integer generated with microtime()                |
| title         | varchar(60)   | current story title                               |
| content       | longtext      | current story text                                |
| coverimg      | varchar(20)   | cover image name                                  |

Die Gründe, warum ich hierher gekommen bin:

  • Das Feld uid der Anfangstabelle war in der Tabelle EINZIGARTIG. Jetzt die story_id ist nicht mehr eindeutig. Wie soll ich damit umgehen? (Ich dachte, ich könnte story_id = x und dann die neueste Version finden, aber das scheint sehr ressourcenintensiv zu sein, also geben Sie bitte Ihren Rat)
  • author_id Der Feldwert wird in jeder Zeile der Tabelle wiederholt. Wo und wie soll ich es aufbewahren?

Bearbeiten

Der Prozess zur Generierung eindeutiger Codes befindet sich in der Funktion CreateUniqueCode:

trait UIDFactory {
  public function CryptoRand(int $min, int $max): int {
    $range = $max - $min;
    if ($range < 1) return $min;
    $log = ceil(log($range, 2));
    $bytes = (int) ($log / 8) + 1;
    $bits = (int) $log + 1;
    $filter = (int) (1 << $bits) - 1;
    do {
        $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        $rnd = $rnd & $filter;
    } while ($rnd >= $range);
    return $min + $rnd;
  }
  public function CreateUID(int $length): string {
    $token = "";
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    $codeAlphabet.= "0123456789";
    $max = strlen($codeAlphabet) - 1;
    for ($i=0; $i < $length; $i++) {
        $token .= $codeAlphabet[$this->CryptoRand(0, $max)];
    }
    return $token;
  }
}

Der Code ist in Hack geschrieben und wurde ursprünglich in PHP von @ Scott in seiner Antwort geschrieben.

Die Felder author_id und editor_id kann sein anders, weil es Benutzer gibt, die über genügend Berechtigungen verfügen, um die Geschichten anderer zu bearbeiten.

15
Victor

Eine Möglichkeit ist die Verwendung von Version Normal Form (vnf). Die Vorteile umfassen:

  • Die aktuellen Daten und alle vergangenen Daten befinden sich in derselben Tabelle.
  • Dieselbe Abfrage wird verwendet, um aktuelle Daten oder Daten abzurufen, die zu einem bestimmten Datum aktuell waren.
  • Fremdschlüsselverweise auf versionierte Daten funktionieren genauso wie für nicht versionierte Daten.

Ein zusätzlicher Vorteil in Ihrem Fall: Da versionierte Daten eindeutig identifiziert werden, indem das Datum des Inkrafttretens (das Datum, an dem die Änderung vorgenommen wurde) Teil des Schlüssels ist, ist kein separates Feld version_id erforderlich.

Hier ist eine Erklärung für einen sehr ähnlichen Entitätstyp.

Weitere Details finden Sie in einer Folienpräsentation hier und einem noch nicht vollständig ausgefüllten Dokument hier

2
TommCatt

Ihre Beziehung

 (story_id, version_id, editor_id, author_id, Zeitstempel, Titel, Inhalt, Coverimg) 

ist nicht in der 3. Normalform. Für jede Version Ihrer Geschichte ist die author_id dieselbe. Sie brauchen also zwei Beziehungen, um dies zu überwinden

 (story_id, author_id) 
 (story_id, version_id, editor_id, Zeitstempel, Titel, Inhalt, Coverimg) 

Der Schlüssel der ersten Beziehung ist story_id, Der Schlüssel der zweiten Beziehung ist der kombinierte Schlüssel (story_id, version_id). Wenn Sie keinen kombinierten Schlüssel mögen, können Sie nur version_id Als Schlüssel verwenden

1
miracle173