在我的应用程序中,大多数ID(user_id,classical_id,post_id,assessment_id等)都是公开可用的,这意味着它们位于URL或目录名称中。出于安全原因,我希望每个表格都具有10个字符的随机ID,而不是自动递增的ID。
我可以使用时间戳,但这并不是唯一的时间戳,添加随机数会变得更长(例如,我必须添加4个随机数才能每秒处理一张表最多10.000个DB插入。纯粹是假设它是不可缩放的。
现在,我希望创建一个 10个字符的随机ID ,这将为我提供 100亿个可能的ID组合。因此,生成副本的机会非常小,而且长度也可以接受。
longjmp(3)
您认为我的想法有意义吗?有人知道使用10个字符的主ID是否会对我的数据库性能产生负面影响吗?谢谢!
答案 0 :(得分:1)
您最好改用insert/update/read restart script insert/update/read/
。
您使用哪种数据库类型?大多数数据库类型都支持UUID类型,并且可以自动生成它们,因此您不必自己生成它们。
签出: https://dev.mysql.com/doc/refman/8.0/en/miscellaneous-functions.html#function_uuid
答案 1 :(得分:0)
我可以建议生成ID的三个软件包。
您可以查看所有三个可用软件包,然后选择一个,或者可以从中获得启发的DIY解决方案。
答案 2 :(得分:0)
您可以使用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'
];
希望这会有所帮助。