Я работаю над проектом базы данных для студентов, где мне нужно создать уникальный 13-значный идентификатор (в базе данных, а не универсальный уникальный идентификатор), основанный на шаблоне.
Шаблон выглядит следующим образом: первые четыре цифры — это код штата, следующие две цифры — год поступления студента, а остальные 7 цифр — простой код последовательности, например, 01031150000001.
Я не могу использовать функцию автоинкремента mysql, потому что порядковые номера должны быть независимы от кодов штатов и года поступления.
Чтобы прояснить ситуацию, представьте, что у меня есть только три кода штата: штат A = 0101, штат B = 0102 и штат C = 0103, и давайте предположим, что мы генерируем идентификаторы для 2015 года, поэтому двухзначный код года будет 15.
Теперь проблема заключается в том, что первый студент, допущенный в государство A, должен получить идентификатор 0101150000001, аналогично, первому студенту штата B должен быть присвоен идентификатор 0102150000001, а первому студенту штата C — 0103150000001, и эти последовательности должны продолжаться. в этом порядке независимо от других государств.
Проблема также осложняется тем, что для каждого года последовательность должна быть перезапущена. Например, первый студент в штате А на 2016 год должен получить ID 0101160000001. И чтобы еще больше запутать его, прошлые записи о студентах должны произвольно вводиться в базу данных, что означает, что может быть студент, дата поступления которого После 2015 года за такой записью может следовать студент, дата поступления которого — 1998 год, и снова за ним может следовать студент, дата поступления которого — 2014 год, и так далее.
Я пытаюсь сказать, что ввод данных не будет сортироваться по годам, поэтому нет способа сбрасывать поле автоинкремента каждый год.
Последовательность для каждого из штатов на каждый год должна оставаться открытой или продолжаться вечно.
Хотя я могу управлять этим с помощью отдельных таблиц, генерирующих идентификаторы для каждого года для каждого штата, но мне было интересно, существует ли более профессиональный метод эффективной генерации и управления идентификаторами таких типов ????
Пожалуйста, не отмечайте его как дубликат, так как я уже искал ваш форум, а также в Google, но не смог найти ничего связанного. Благодарю. Кстати, я должен реализовать это в MySql и PHP.
В настоящее время мне нужно хранить данные ученика в таблице. Там будут такие атрибуты, как ID, имя, фамилия, адрес, происхождение и т. Д. Будут другие таблицы, содержащие данные о школах и других объектах, а также об отношениях между ними. У меня все есть на месте. Проблема только в удостоверении личности. Мне нужен надежный алгоритм генерации идентификатора для этой цели. Алгоритм никогда не должен создавать два одинаковых идентификатора, даже если в одну секунду одновременно делаются тысячи записей.
Самым простым решением будет дизайн таблицы, подобный следующему.
Сначала создайте первичную таблицу для заполнения записей учеников; это только использует 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;
Теперь у вас будет промежуточная таблица «один к одному», содержащая поля для кода штата, даты поступления и уникального идентификатора. Разрабатывая его таким образом, вы допускаете простой метод, реализующий рекурсивную функцию, которая будет обрабатывать последовательное значение для identifier
поле на основе каждой ссылки student_id
запись. О, я изменил код года для обработки INT(4)
(очень много багов) & расширил семизначный идентификатор до BIGINT
справиться с ростом.
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
за комбинацию state
+ year
+ identifier
,
<?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;
}
?>
Не моя лучшая работа, но она должна помочь вам начать с решения
Других решений пока нет …