MYSQL |状态的数据类型

时间:2016-01-10 18:36:22

标签: mysql sql database sqldatatypes states

我需要确定用于状态的数据类型。

应该是SET还是VARCHAR还是其他什么?

CREATE TABLE actors(
    state SET('USA','Germany','....)
    )

替代地

CREATE TABLE actors(
state VARCHAR(30)
)

4 个答案:

答案 0 :(得分:1)

假设有几十个或几百个国家,最好使用单独的表格。

CREATE TABLE states(
  state_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(30)
);

还建议在state_id上​​使用外键,因此如果要从数据库中删除状态,则不会破坏其他数据。

如果每个actor只分配给一个状态(1:1),你可以在actors表中使用column。

CREATE TABLE actors(
   actor_id INT ...,
   state_id INT,
)

或者如果每个actor都可以分配到更多状态(1:N),则使用另一个表来表示这些关系:

CREATE TABLE actors(
   actor_id INT ...,
)
CREATE TABLE actors_to_states(
   actor_id INT,
   state_id INT
)

答案 1 :(得分:1)

SET是一种复合数据类型,包含来自预定义可能值集的值。如果表包含这样的数据,则根据关系数据库理论,它不在1NF中。因此,只有少数特殊情况下这种方法是合理的。在大多数情况下,我建议为国家/地区使用单独的表格,如下例所示:

CREATE TABLE countries (id SMALLINT, name VARCHAR(100))

答案 2 :(得分:0)

要回答这些类型的问题,您应该进行一些数据分析并向您的数据提出一些问题,例如:

  
      
  1. 我的数据的最大大小是多少?
  2.   

在您的情况下,它将是具有最大名称的国家。请注意这一点。添加20以保持安全。

  
      
  1. 我的数据是否总是包含数字或字符或组合?
  2.   

在你的情况下只有字符。所以它是varchar

同时规划您的数据模型,以便之后无需进行编辑。在这种情况下,我不会建议使用set

答案 3 :(得分:0)

我建议您使用标准缩写(US代表USA,DE代表德国)并将其放入

country_code CHAR(2) CHARACTER SET ascii NOT NULL

这样,它是紧凑的(2字节)并且可由用户读取。然后,如果您愿意,您可以使用另一个表格来说明国家名称。

如果actor可以属于多个states,那么这不会有效,而您确实需要SET。如果您需要,我们可以进一步讨论。