【发布时间】:2019-05-14 07:26:54
【问题描述】:
例如,假设您有一个包含订单的表,并且该表有一个列来跟踪订单是否处于待处理/已发货/拒绝/已批准。保持状态记录的更好方法是什么?
选项一。将状态作为字符串保存在索引列中。
-------------------------------------------------------
| id | customer_id | status | created_at | shipped_at |
-------------------------------------------------------
| 1 | 1| pending| . . . | . . . |
-------------------------------------------------------
或 选项二。有一个单独的表,其中包含可能的状态,并且状态列是指向包含状态的表的外键。
Table: Statuses
----------------
| id | name |
----------------
| 1 | pending |
----------------
| 2 | approved|
----------------
| 3 | denied |
----------------
| 4 | shipped |
----------------
Table: Orders
-------------------------------------------------------
| id | customer_id | status | created_at | shipped_at |
-------------------------------------------------------
| 1 | 1| 1| . . . | . . . |
-------------------------------------------------------
在我看来,第一个更简单,但如果表变得很大,它会变慢,而在这种情况下,第二个会更快。
【问题讨论】:
-
还有枚举。但是,什么更快,什么操作并没有那么明确。
-
考虑到表的大小会随着时间的推移而增长。使用连接获取数据将花费更多时间。对我来说,这是第一个选择。
-
如果您对脏数据感到满意,请选择选项 1,如果您更愿意为选项 2 保持紧张状态。(无论如何,外键检查并不那么昂贵)而且我会保留订单和订单详情的所有更改...
-
我不会将其发布为答案,因为不可避免的大量反对票,但 MySQL ENUM 类型实际上非常适合这个特定的应用程序,并且会节省空间和时间损失
JOIN. -
就性能而言,它的内容不多,但我们这些珍视数据完整性的人会选择 2(甚至超过 ENUM)。
标签: php mysql performance optimization