首页>Database>source

我正在使用带有 users表的简单数据库 , productsorders ,但以前是 products 我认为对于 weights而言,桌子的设计不是很好 列中只有一个数字,但不清楚是以磅还是盎司为单位。

我试图找到有关如何将磅和盎司指定为桌子重量单位的文档,但是我没有成功.有人可以建议一种方法吗? 同样,该列简称为 weight ,如何明确说明Postgres内部的重量单位为2盎司,最重为1磅?

最新回答
  • 1月前
    1 #

    我的第一个直觉是使用公制,但是如果必须使用 英制尺寸,我建议您将重量存储为盎司,但应使用[ Computed | Calculated | Virtual | Derived ]列-实际上称为 Generated 在PostgreSQL中-请参阅有关 Virtual columns的wiki文章 -表示"行业标准"是:

    column_name [type] GENERATED ALWAYS AS (expression)
    

    PostgreSQL坚持使用SQL标准通常非常好! 此处提供了有关生成的列的PostgreSQL文档。

    英制单位-即以盎司为单位的重量(请参阅下文以了解公制):

    我会遇到这样的事情(请参阅此处的小提琴):

    CREATE TABLE foo
    (
      field_1 SERIAL PRIMARY KEY,
      field_2 VARCHAR (25) NOT NULL,
      --
      --  Other fields
      -- 
      weight_oz INTEGER NOT NULL,
      pound_oz INTEGER GENERATED ALWAYS AS (weight_oz/16) STORED,   -- INTEGER division
      ounce_oz INTEGER GENERATED ALWAYS AS (MOD(weight_oz, 16)) STORED  -- Remainder
    );
    

    然后用一些示例数据填充它:

    INSERT INTO foo (field_2, weight_oz) VALUES ('asdfa', 25), ('adfads', 78);
    

    然后:

    SELECT * FROM foo;
    

    结果:

    field_1 field_2  weight_oz  pound_oz    ounce_oz
          1   asdfa         25         1           9
          2  adfads         78         4          14
    

    现在,不幸的是,PostgreSQL还没有 VIRTUAL 关键字,用于生成字段的存储类型(与MySQL不同),这在这里会更好,但是AIUI即将推出。

    此外,您没有提到您的PostgreSQL版本(您应该 always 这样做),但此处探讨了在12之前的版本中执行此操作的方法。

    S.I. (SystèmeInternational)单位-即以千克为单位的重量。

    我添加了一种处理重量的方法,其中重量以千克存储(S.I.单位是任何数量IMHO的理想存储介质).从这里开始," 1千克= 35.27396195盎司".相反,以盎司(oz)为单位的质量m等于以千克(kg)为单位的质量m除以0.02834952(35.xxx的倒数)。

    从PostgreSQL文档中,一个 REAL 变量:

    On most platforms, the real type has a range of at least 1E-37 to 1E+37 with a precision of at least 6 decimal digits.

    对于大多数需求来说应该足够了-如果不是,您可以使用 NUMERICDECIMAL 类型,但(在同一页面上):

    However, calculations on numeric values are very slow compared to the integer types, or to the floating-point types

    此方法可以工作到最接近的盎司-我已经在这里进行了测试,看来效果很好.当然,如果您希望小数盎司消除潜在的舍入误差,请将其保留为 REAL (原谅双关语!)! 小提琴在这里可用:

    CREATE TABLE foo
    (
      field_1 SERIAL PRIMARY KEY,
      field_2 VARCHAR (25) NOT NULL,
      --
      --  Other fields
      -- 
      weight_kg REAL NOT NULL,
      pound_kg INTEGER GENERATED ALWAYS AS (((weight_kg * 35.273961)::INT)/16) STORED, 
      ounce_kg INTEGER GENERATED ALWAYS AS (MOD((weight_kg * 35.273961)::INT, 16)) STORED
    );
    

    人口:

    INSERT INTO foo (field_2, weight_kg) 
    VALUES 
    ('xxxxx', 0.85), ('asdfa', 25), ('adfads', 78);
    

    然后:

    SELECT * FROM foo;
    

    结果:

    field_1 field_2 weight_kg   pound_kg    ounce_kg
          1   xxxxx      0.85          1          14
          2   asdfa        25         55           2
          3   adfads       78        171          15
    

  • 使用REPLACE函数代替CASE语句时,MySQL查询运行缓慢
  • optimization:通过用户名查询数据-对-最佳性能