mysql - 如何管理MySQL数据库中的条件列?

标签 mysql database database-design entity-relationship

我和this old post有同样的问题.

但在我的例子中,我没有表格,我只有两个列。我解释:

***mytable
id
name
conditional_1 (is a foreign key int)
conditional_2 (int)

包含的数据是这样的:

id  name   conditional_1  conditional_2
1   oscar  1              NULL
2   rene   NULL           67
3   hello  2              NULL
4   stack  4              NULL
5   overf  NULL           98

我做的对吗?或者我需要如下内容:

***mytable
id
name
cond_type 
conditional_id (fk tbl_post)

***condtable1
conditional_1 

***condtable1
conditional_2

这种情况的最佳解决方案是什么?

最佳答案

通过在同一个表中使用列,您可以强制执行排他性和引用完整性。换句话说,您可以确保在给定的行中,至多有一个字段是非 NULL1 并且 引用正确表中的现有行。或者,您可以考虑继承。有关两者的更多信息,请查看 this post .

cond_type 之类的东西从 DBMS 的角度来看没有任何意义 - 您将放弃参照完整性的自动实现。在并发环境中手动执行此操作可能不正确或很慢。2


1 不幸的是,MySQL 不强制执行 CHECK 约束(这将是强制排他性的自然机制),但您仍然可以依赖触发器。

2 您需要非常小心地锁定以避免竞争条件,即使您做得对,您也可能会损害过程中的可伸缩性。

关于mysql - 如何管理MySQL数据库中的条件列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18884059/

相关文章:

database - 我应该在单独的表中跟踪递增的 AccountNumber 吗?

database-design - DynamoDB + 将值存储为项目或 JSON

删除所有单引号和短划线字符后的 SQL 注入(inject)

python - 如何使用 executemany 将 Python 中的字典列表插入 MySQL

Java map 与后端数据库。哪个更适合速度和关系的多线程?

php - MySQL 和 PHP 的 ORDER BY 错误

mysql - Liquibase 变更集的自动回滚

database - 从控制台创建 Neo4j 数据库时,Gremlin 创建什么版本的数据存储?

php - 使用空变量/值更新 MySQLi

java - 当我尝试在 Spring 中下载 CSV 时获得 CPU 100%