artoodetoo / so-example
Laravel 的 StackOverflow 数据库
Requires
- php: ^7.2
- fideloper/proxy: ^4.0
- laravel/framework: ^6.2
- laravel/tinker: ^2.0
Requires (Dev)
- facade/ignition: ^1.4
- fzaninotto/faker: ^1.4
- mockery/mockery: ^1.0
- nunomaduro/collision: ^3.0
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-08-30 01:20:23 UTC
README
Laravel 的 StackOverflow 数据库
简介和免责声明
这不会是任何意义上的 S.O. 复制。我的目标是获得足够大且接近现实世界的数据库沙盒。并使其准备好与 Laravel Eloquent 一起使用。
具体来说,这是 StackExchange 几个问答网站的常见结构,而不仅仅是 stackoverflow.com。
请从这篇精彩的 Brent Ozar 博文 开始,获取更多关于这个主题的信息。
原始数据库是 MS SQL 格式,并提供了 XML 格式的转储。数据库包含被混淆的私人信息,并在 cc-by-sa 许可下公开发布。
我的目标是创建符合 Laravel 标准的 MySQL 数据库。它将是一组迁移、类和控制台命令,用于导入数据库转储并在需要时填补空白。
由于这是一个一次性操作,我不会尝试尽可能快地进行导入。 我知道,SQL 可以比 PHP 侧的循环更有效。但就是这样。
注意
截至 v0.1,表没有索引和外键。这允许快速导入数据,但查询速度较慢。
从 v0.2 开始,我一直在努力实现数据一致性和查询优化,因此迁移中将有索引和 FK。请在导入之前运行
git reset <tagname> --hard
或git pull
以获取此或那个迁移集。
Laravel 化
现在所有名称都使用 snake_case。
通常使用 created_at
和 updated_at
名称作为时间戳,因此我在适用的情况下将原始字段名称替换为这些名称。
对于 users
表,我使其与标准 Laravel 身份验证兼容,因此添加了一些字段。
我将一些超级长的名称缩短了,例如 PostHistoryTypeId
> history_type_id
。
为了使用无符号大整数作为主键和外键,我将特殊值 "-1" 替换为 "1"。
缺失数据
出于隐私考虑,某些字段在转储中没有提及。但它们显然是必需的,如电子邮件和密码。请参阅我关于 users
的说明。
Votes
表缺少投票用户引用。在大多数情况下(例外是赏金和收藏),它是 null,看起来非常不真实,必须用假数据填充。
Posts
和 Tags
应该是多对多关系。缺失的关联表是 post_tag
,唯一的来源是去规范化字段 posts.tags
。
用法
安装
composer create-project artoodetoo/so-structure
然后转到新项目目录,在 .env 文件中设置数据库参数,并运行
php artisan migrate
以创建所有表。
数据导入和后处理
从网络存档网站或通过种子下载数据库转储。(你可以在 Brent 的文章中找到链接)
逐个导入表内容
php artisan stack:import path/to/Table.xml
通常,对于每个网站,你有 8 个文件或表要导入
Users
、Badges
、Tags
、Posts
、Comments
、Votes
、PostLinks
、PostHistory
。
第 9 个表 post_tag
不会随包装提供。要重新创建其数据,您必须运行
php artisan stack:post-tag
转储中的投票是匿名的。唯一的例外是收藏和赏金操作。
为了将接受和上下文投票附加到随机用户,请调用
php artisan stack:vote-users --action=accept php artisan stack:vote-users --action=up-down
(这些操作非常慢)
许可
StackOverflow DB for Laravel 是开源软件,根据 MIT 许可证 许可。