MYSQL|状态的数据类型
MYSQL|Datatype for states
我需要弄清楚 states 使用哪种数据类型。
应该是 SET
或 VARCHAR
还是其他什么?
CREATE TABLE actors(
state SET('USA','Germany','....)
)
或者
CREATE TABLE actors(
state VARCHAR(30)
)
要回答这些类型的问题,您应该进行少量数据分析并对您的数据提出一些问题,例如:
- What is the maximum size of my data ?
在您的情况下,它将是名称最大的国家/地区。记下这一点。加20以防万一。
- Will my data always contain numbers or characters, or combination ?
在你的例子中只有字符。所以它是 varchar
.
同时规划您的 data-model,这样您以后就不需要编辑了。在这种情况下,我不建议使用 set
。
假设有几十个或一百多个国家,最好使用单独的 table。
CREATE TABLE states(
state_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
);
还建议在 state_id 上使用外键,这样如果您想从数据库中删除一个状态,它不会破坏依赖它的其他数据。
如果每个 actor 只分配给一个状态 (1:1),您可以在 actors table.
中使用列
CREATE TABLE actors(
actor_id INT ...,
state_id INT,
)
或者如果每个演员可以分配给更多状态 (1:N),则对这些关系使用另一个 table:
CREATE TABLE actors(
actor_id INT ...,
)
CREATE TABLE actors_to_states(
actor_id INT,
state_id INT
)
SET 是一种复合数据类型,包含预定义的一组可能值中的值。如果 table 包含这样的数据,那么根据关系数据库理论,它不在 1NF 中。所以只有少数特殊情况下这种方法是合理的。在大多数情况下,我建议对国家/地区使用单独的 table,如下例所示:
CREATE TABLE countries (id SMALLINT, name VARCHAR(100))
我建议您使用标准缩写(US 表示美国,DE 表示德国)并将其放入
country_code CHAR(2) CHARACTER SET ascii NOT NULL
这样,它是紧凑的(2 个字节)并且可供用户阅读。然后,如果你愿意,你可以有另一个 table 来拼出国家名称。
如果一个 actor
可以属于多个 states
,那么这将不起作用,您需要有一个 SET
。如果您需要,我们可以进一步讨论。
我需要弄清楚 states 使用哪种数据类型。
应该是 SET
或 VARCHAR
还是其他什么?
CREATE TABLE actors(
state SET('USA','Germany','....)
)
或者
CREATE TABLE actors(
state VARCHAR(30)
)
要回答这些类型的问题,您应该进行少量数据分析并对您的数据提出一些问题,例如:
- What is the maximum size of my data ?
在您的情况下,它将是名称最大的国家/地区。记下这一点。加20以防万一。
- Will my data always contain numbers or characters, or combination ?
在你的例子中只有字符。所以它是 varchar
.
同时规划您的 data-model,这样您以后就不需要编辑了。在这种情况下,我不建议使用 set
。
假设有几十个或一百多个国家,最好使用单独的 table。
CREATE TABLE states(
state_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
);
还建议在 state_id 上使用外键,这样如果您想从数据库中删除一个状态,它不会破坏依赖它的其他数据。
如果每个 actor 只分配给一个状态 (1:1),您可以在 actors table.
中使用列CREATE TABLE actors(
actor_id INT ...,
state_id INT,
)
或者如果每个演员可以分配给更多状态 (1:N),则对这些关系使用另一个 table:
CREATE TABLE actors(
actor_id INT ...,
)
CREATE TABLE actors_to_states(
actor_id INT,
state_id INT
)
SET 是一种复合数据类型,包含预定义的一组可能值中的值。如果 table 包含这样的数据,那么根据关系数据库理论,它不在 1NF 中。所以只有少数特殊情况下这种方法是合理的。在大多数情况下,我建议对国家/地区使用单独的 table,如下例所示:
CREATE TABLE countries (id SMALLINT, name VARCHAR(100))
我建议您使用标准缩写(US 表示美国,DE 表示德国)并将其放入
country_code CHAR(2) CHARACTER SET ascii NOT NULL
这样,它是紧凑的(2 个字节)并且可供用户阅读。然后,如果你愿意,你可以有另一个 table 来拼出国家名称。
如果一个 actor
可以属于多个 states
,那么这将不起作用,您需要有一个 SET
。如果您需要,我们可以进一步讨论。