-2

私は、パターンに基づいた一意の 13 桁の ID (ユニバーサル一意 ID ではなく、データベース内) を生成する必要がある学生データベース プロジェクトに取り組んでいます。

パターン

パターンは次のようになります: 最初の 4 桁は州コード、次の 2 桁は学生の入学年、残りの 7 桁は単純なシーケンス コード (例: 01031150000001) です。

問題

シーケンス番号は州コードや入学年とは無関係でなければならないため、mysql の自動インクリメント機能を使用できません。

明確にするために、州 A=0101、州 B=0102、州 C=0103 の 3 つの州コードしかないと考えて、2015 年の ID を生成すると仮定すると、2 桁の年コードは 15 になります。

ここでの問題は、州 A で入学を許可された最初の学生には 0101150000001 として ID を取得する必要があることです。同様に、州 B の最初の学生には ID 0102150000001 を割り当て、州 C の最初の学生には ID 0103150000001 を割り当て、これらのシーケンスを続行する必要があります。この順序で、他の状態とは独立しています。

この問題は、毎年シーケンスを再開しなければならないという事実によっても複雑になります。たとえば、2016 年の州 A の最初の学生は、ID 0101160000001 を取得する必要があります。さらに混乱させるために、過去の学生の記録がランダムにデータベースに入力されます。つまり、入学日が2015 年であり、そのようなエントリの後に入学日が 1998 年の学生が続き、さらに入学日が 2014 年の学生が続く可能性があります。

私が言おうとしているのは、データ入力は年ごとにソートされないため、毎年自動インクリメント フィールドをリセットする方法がないということです。

毎年の各州のシーケンスは、開いたままにするか、永久に継続する必要があります。

州ごとに年ごとに個別のID生成テーブルで管理できますが、そのようなタイプのIDを効率的に生成および管理するより専門的な方法があるかどうか疑問に思っていました????

私はすでにあなたのフォーラムとGoogleで検索しましたが、関連するものは何も見つかりませんでしたので、重複としてマークしないでください. ありがとう。ちなみに、MySql と PHP で実装する必要があります。

構造

現在、学生のデータをテーブルに保存する必要があります。ID、名、姓、住所、親子関係などの属性があります。学校やその他のエンティティ、およびそれらの間の関係に関するデータを含む他のテーブルがあります。すべて揃っています。問題は ID だけです。この目的のために、信頼できる ID 生成アルゴリズムが必要です。同じ秒間に何千ものエントリが同時に作成されたとしても、アルゴリズムは 2 つの類似した ID を生成することは決してありません。

4

1 に答える 1

1

最も簡単な解決策は、次のようなテーブル デザインです。

最初に、学生のレコードを入力するためのプライマリ テーブルを作成します。これは使用するだけですがstudent_id、実際には名前などの追加の詳細が含まれます。

CREATE TABLE IF NOT EXISTS `students` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `student_id` BIGINT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTOINCREMENT=0;

これで、州コード、入学日、および一意の ID のフィールドを含む 1 対 1 の中間テーブルが作成されます。このような方法で設計することにより、参照される各レコードidentifierに基づいてフィールドの連続値を処理する再帰関数を実装する単純なメソッドが可能になります。student_idああ、年コードを処理するように変更しINT(4)(y2k バグが多かった)、BIGINT成長を処理するために 7 桁の識別子を に拡張しました。

CREATE TABLE IF NOT EXISTS `student_ids` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `student_id` BIGINT NOT NULL,
  `state` INT(4) NOT NULL,
  `year` INT(4) NOT NULL,
  `identifier` BIGINT NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_students2student_ids` FOREIGN KEY (`student_id`)
    REFERENCES `students`(`id`)
      ON UPDATE CASCADE
      ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=0;

+ +identifierの組み合わせごとに最後の数値を組み合わせて決定する再帰関数になりました。stateyearidentifier

<?php //pseudo-code, not tested
$states = array(0101, 0102, 0103);
$years = array(1999, 2000, 2001, 2002);

function robot_do_work() {
  foreach ($states as $st) {
    foreach ($years as $yr) {
      // Create PDO SQL statement
      $handle = $conn->pdo->prepare('SELECT SUM(MAX(`identfier`) + 1) FROM `student_id` WHERE `state` = :state AND `year` = :year DESC');

      // Execute PDO SQL statement with values for :state & :year
      $sth = $handle->execute(array(':state' => $st, ':year' => $yr));

      $record_incremented = $sth->fetchAll();
    }
  }
  return $record_incremented;
}
?>

私の最高の仕事ではありませんが、それはあなたが解決策を始めるのに役立つはずです

于 2015-10-17T19:35:20.413 に答える