Laravel ID первичная альтернатива автоинкремента - PullRequest
0 голосов
/ 21 мая 2019

В моем приложении большинство идентификаторов (user_id, classroom_id, post_id ,valuation_id и т. Д.) Общедоступны, что означает, что они находятся либо в URL-адресе, либо в имени каталога.Из соображений безопасности я хотел бы иметь 10-символьные случайные идентификаторы для каждой таблицы вместо автоматически увеличиваемых.

Я мог бы использовать временную метку, но она на самом деле не уникальна, и при добавлении случайных чисел она стала бы намного длиннее (например, мне пришлось бы добавить 4 случайных числа для обработки до 10.000 вставок БД в таблицу заво-вторых ... чисто гипотетически это не масштабируется).

Теперь я бы предпочел создать случайный идентификатор 10 символов , это дало бы мне 10 миллиардов возможных комбинаций идентификаторов .Поэтому вероятность создания дубликата очень мала, а длина также приемлема.

use Keygen;

$id = Keygen::numeric(10)->generate();

Как вы думаете, мои мысли имеют смысл?И кто-нибудь знает, если использование 10-символьных первичных идентификаторов отрицательно повлияет на производительность моей БД?Спасибо!

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Лучше вместо этого использовать UUID.

Какой тип базы данных вы используете? Большинство типов баз данных поддерживают тип UUID и могут генерировать их автоматически, поэтому вам не нужно создавать их самостоятельно.

Выезд: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid

0 голосов
/ 21 мая 2019

Вы можете использовать UUID.Я предлагаю вам использовать метод вспомогательных строк Laravel по умолчанию для генерации UUID.Ниже описано, как этого добиться.

use Illuminate\Support\Str;

$uuid = Str::uuid()->toString(); //this generates a v4 UUID.

В своей миграции вы можете указать столбец uuid, например:

**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{ 
    Schema::create('users', function (Blueprint $table) {
        $table->uuid('id')->primary(); //uuid field set to PK
    });
}

В ваших моделях, скажем, User.php,установите следующие свойства.

protected $primaryKey = 'id';

public $incrementing = false;

protected $keyType = 'string';

Я предлагаю вам сохранить в ваших таблицах автоинкремент, чтобы помочь вам определить количество записей без написания каких-либо запросов (это необязательно).например.скажем, такой столбец rowId, вы можете скрыть это от своего ответа, добавив его в массив скрытых свойств модели.Например,

protected $hidden = [
    'password', 'remember_token', 'rowId'
];

Надеюсь, это поможет.

0 голосов
/ 21 мая 2019

Я могу предложить три пакета для генерации идентификатора.

  1. Пакет UUID веб-сервера Laravel
    Позволяет генерировать UUID для ваших моделей, довольно прост в настройке и использовании.Этот тип идентификаторов непредсказуем и может считаться более безопасным, но не может быть отсортирован в вашей базе данных. Github
  2. Пакет Vinkla's Laravel Hashids
    Сохраните свои текущие идентификаторы и получите хеш, который можно расшифровать, чтобы публично скрыть его. Github
  3. Пакет Laraflake от Hafael
    Твиттер-снежинка, как генерация идентификаторов, хорошая производительность и лучшие функции, идентификаторы можно сортировать. Github

Вы можете взглянуть на все три доступных пакета и выбрать один, или же вы можете создать решение для DIY, вдохновленное этими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...