artoodetoo/so-example

Laravel 的 StackOverflow 数据库

v0.1 2020-02-17 10:42 UTC

README

Latest Stable Version License

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> --hardgit pull 以获取此或那个迁移集。

Laravel 化

现在所有名称都使用 snake_case。
通常使用 created_atupdated_at 名称作为时间戳,因此我在适用的情况下将原始字段名称替换为这些名称。
对于 users 表,我使其与标准 Laravel 身份验证兼容,因此添加了一些字段。
我将一些超级长的名称缩短了,例如 PostHistoryTypeId > history_type_id
为了使用无符号大整数作为主键和外键,我将特殊值 "-1" 替换为 "1"。

缺失数据

出于隐私考虑,某些字段在转储中没有提及。但它们显然是必需的,如电子邮件和密码。请参阅我关于 users 的说明。
Votes 表缺少投票用户引用。在大多数情况下(例外是赏金和收藏),它是 null,看起来非常不真实,必须用假数据填充。
PostsTags 应该是多对多关系。缺失的关联表是 post_tag,唯一的来源是去规范化字段 posts.tags

用法

安装

composer create-project artoodetoo/so-structure

然后转到新项目目录,在 .env 文件中设置数据库参数,并运行

php artisan migrate

以创建所有表。

数据导入和后处理

从网络存档网站或通过种子下载数据库转储。(你可以在 Brent 的文章中找到链接)
逐个导入表内容

php artisan stack:import path/to/Table.xml

通常,对于每个网站,你有 8 个文件或表要导入
UsersBadgesTagsPostsCommentsVotesPostLinksPostHistory
第 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 许可证 许可。