繁体   English   中英

在不使用枚举的情况下,从 MySQL 的一组预选数据中输入数据的最佳方法是什么?

[英]Without using enums, what's the best way to enter data from a set of preselected data for MySQL?

例如,我要说我正在为虚构世界中的前任总统制作一个数据库,在那里他们有 Windows 派对、Mac 派对、Debian 派对、Ubuntu 派对和 Unix 派对。 没有其他政党,但这可能会时不时地改变(没有“独立人士”)。 我想使用 PHP 的网络抓取库从列出这些数据的网站上抓取数据,但我担心当他们在某个时候更改网站时可能会搞砸,并且如果我不小心输入了以下条目以外的任何其他条目对 MySQL 使用char 因此,例如,如果网站Ubunta并输入Ubunta而不是Ubuntu ,那会弄乱我的数据库。

因此,不是从 PHP 端清理数据,我可以采取哪些步骤来确保除预先选择的各方列表之外的任何其他条目都会吐出错误? 以下是我目前考虑的选项:

  • 我知道我可以使用enum数据类型,但我听说并不真正推荐它。 我正在使用 Laravel 进行数据输入,并且它在较新版本上得到支持,但我听说enum本身并不是真正推荐的做事方式,尤其是在 mySQL 上。

  • 我也知道我可以使用 PHP 端验证。 但是当有更多“预选选项”(例如国家/地区)时,我正在寻找更好的方法; 例如,对于 240 个条目,我不希望代码具有类似if(country === "Afghanistan" || "United States" || ...)类的内容。 如果可以,我还想添加其他parties ,但我希望它是可维护的,这样人们就不必搜索添加额外if条件的位置。

  • 我还看到我可以使用触发器,但如果我要使用国家之类的东西,我想保持简短。 我还必须手动更新这些触发器,因为 Laravel 不支持构建触发器函数并且必须执行DB::unprepared unprepared 。

  • 为这些partiescountries创建自定义数据表。 可能是最好的选择,并且适用于较长的选项列表,例如country ,但对于较短的选项列表(例如party ,其中只有 5 个政党)似乎完全没有必要。 FOREIGN KEY用于SELECT语句会加速查询而不是执行WHERE吗?

MySQL 8.0.16 支持check约束。 那是一种选择。

但是,如果值随时间发生变化,您最好的选择是参考表(您的最后一个选择)。 正确声明的外键约束正是您想要的。 将来添加新值就像在引用表中添加新行一样简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM