adamthehutt / laravel-unique-bigint-ids
此功能允许在插入数据库之前生成顺序ID,在应用中几乎(但不是完全)保证是全球唯一的。在数据库持久化之前生成ID还有额外的优势,例如,简化代码...
Requires
- php: >=7.3
- adamthehutt/eloquent-constructed-event: ^1.0
- illuminate/database: ^5.8 | ^6.0 | ^7.0 | ^8.0
- illuminate/support: ^5.8 | ^6.0 | ^7.0 | ^8.0
- predis/predis: ^1.1
Requires (Dev)
- orchestra/testbench: ^3.8 | ^4.0
- phpunit/phpunit: ^8.2
- dev-master
- v0.7.1
- v0.7.0
- v0.6.0
- v0.5.0-beta.1
- v0.4.0
- 0.3.x-dev
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.2-beta.6
- v0.2.1-beta.6
- v0.2.0-beta.5
- v0.1-beta.4
- v0.1-beta.3
- v0.1-beta.2
- v0.1-beta.1
- dev-dependabot/composer/league/flysystem-1.1.4
- dev-dependabot/composer/laravel/framework-6.20.26
- dev-nested-string-id-serialization
This package is auto-updated.
Last update: 2022-01-10 20:30:17 UTC
README
此功能允许在插入数据库之前生成顺序ID,在应用中几乎(但不是完全)保证是全球唯一的。
安装
使用composer安装
composer require adamthehutt/laravel-unique-bigint-ids
然后发布配置
php artisan vendor:publish
要使用此包与模型一起使用,只需使用合约和特质即可
use AdamTheHutt\LaravelUniqueBigintIds\Contracts\IdGenerator; use AdamTheHutt\LaravelUniqueBigintIds\GeneratesIdsTrait; class MyModel extends Model implements IdGenerator { use GeneratesIdsTrait;
数据库迁移
如果您打算使用特质与现有模型一起使用,那么您需要创建和运行迁移以确保相关的所有主键和外键都是无符号的64位整数,例如:
$table->bigInteger("id")->unsigned()->primary(); $table->bigInteger("foreign_id")->unsigned();
UUID有什么问题?
没有!UUID很棒,我经常使用它们。但它们解决的是不同类别的问题,当用作主键时,会带来一些非同小可的挑战。此包生成的ID是普通的旧整数(尽管非常大)。它们 不是 像UUID那样全球唯一。但它们几乎保证在您的Laravel应用范围内是唯一的。
AUTO_INCREMENT有什么问题?
传统的、自增的主键如果符合您的需求是不错的。但是,在模型创建时在应用中生成ID,而不是等待其在数据库中持久化,有实际的好处。
更好地处理复杂关系
复杂的现实世界实体通常需要多个相关的eloquent模型才能完全表示。这在使用标准自增ID时可能有些棘手,因为您必须在“主要”模型保存到数据库之后才能正确地关联或附加相关模型。当在模型创建时分配ID,您可以在构建相关模型时完全关联所有相关模型,然后安全地将它们保存到数据库,而无需担心外键的“最后一刻”分配。
不要担心分片数据库
如果您的应用使用数据库分片,您无需担心不同的数据库会重复其主键。
更少的往返次数
避免调用LAST_INSERT_ID()带来的额外数据库往返可以提高一点性能。
配置 / 策略
该包提供了多种生成ID的方法
-
"timestamp" - 默认方法是使用微秒级时间戳的16位数字,并附加当前进程ID的最后2位。这应该在99.9%的时间内有效。
-
"uuid_short" - 您可以编辑配置文件,将"uuid_short"设置为生成策略。这将调用数据库中的UUID_SHORT()函数,并使用返回的值。
-
"redis" - 您可以编辑配置文件,将"redis"设置为生成策略。在这种情况下,将使用Laravel Redis外观来递增和检索递增的ID。如果键不存在,它将使用时间戳策略进行初始化。
JavaScript陷阱
JavaScript无法处理大于2^53的整数。因此,在将模型序列化为JSON时,将大64位整数转换为字符串非常重要。此包为您处理此问题,但这仅影响使用它的模型。如果您有其他不使用此包的特性但与使用该包的模型有外键关系的模型,那么在将它们序列化为JSON时需要解决此问题。
或者,您可以设置UNIQUE_BIGINT_ID_JAVASCRIPT_SAFE
环境变量为true。这将导致库在生成基于时间戳的ID时使用略微降低的精度:14位有效数字而不是16位。这不应该增加冲突的可能性,但可能会导致非常轻微的性能下降,因为变得不可能在相同的1/10000秒内生成超过2个ID。