【问题标题】:MYSQL|Datatype for statesMYSQL|状态的数据类型
【发布时间】:2016-04-15 00:56:12
【问题描述】:

我需要弄清楚 states 使用哪种数据类型。

应该是SETVARCHAR 还是其他?

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

或者

CREATE TABLE actors(
state VARCHAR(30)
)

【问题讨论】:

    标签: mysql sql database sqldatatypes states


    【解决方案1】:

    我建议您使用标准缩写(US 代表美国,DE 代表德国)并输入

    country_code CHAR(2) CHARACTER SET ascii NOT NULL
    

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

    如果一个actor 可以属于多个states,那么这将不起作用,您需要有一个SET。如果您需要,我们可以进一步讨论。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        还建议在 state_id 上使用外键,这样如果你想从数据库中删除一个状态,它就不会破坏其他依赖它的数据。

        如果每个参与者只分配到一个状态 (1:1),您可以使用参与者表中的列。

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

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

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

          还要计划好你的数据模型,这样你以后就不需要编辑了。在这种情况下,我不建议使用set

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-12
            • 2020-08-01
            • 2013-05-20
            • 1970-01-01
            • 1970-01-01
            • 2014-10-24
            • 2013-05-11
            相关资源
            最近更新 更多