SQL命名列

时间:2018-11-13 09:08:19

标签: sql

我正在为学校项目创建一个表,并且在其中一个表中,我存储了有关平板电脑的不同规格,并且在定义这些设备的CPU和RAM时,还需要指定测量单位。因此,我可以为CPU之类的列添加名称吗?或RAM_GB ???

之所以这样说,是因为我可能想对这些值执行一些查询,并且我知道在以这种格式保存信息“ 4432mah”的情况下,我可以执行特殊查询来提取数字。认为不是很好),但是由于我是从头开始做数据库,因此可能如上所述保存了它? CPU_Ghz ????或RAM_GB ??? Battery_mAh ??

感谢您的帮助 祝你有美好的一天!

3 个答案:

答案 0 :(得分:2)

您可以使用单独的单位表

units table
-----------
id
unit_name

然后在您的设备表中引用它

devices table
-------------
id
device_name
cpu_speed
cpu_unit_id

答案 1 :(得分:2)

是的,最好将单位包含在列名称中,而不要包含在数据中。这样,您可以将数据存储为数字,这比将其存储为代表值和单位的字符串有很多优势:

  1. 每列只存储一个值,这符合1NF规则。
  2. 数据库可以强制值正确性。您只能在正确的范围内存储正确的数字类型。
  3. 所有查询都简单得多。
  4. 您只需查看列名即可知道度量单位。
  5. 您正在告诉数据库用户该列的值是一个特定的单位-如果您要存储一个字符串,则本可以将频率存储为1Ghz或1000Khz,并且必须分析这些单位以获得正确的值。
  6. 您可以使用SUM,AVG等聚合功能(感谢Damien!)

答案 2 :(得分:0)

您建议在列名称中包含单位是好的。通常,您会看到在没有任何上下文的情况下保留数值的代码,因此不清楚磁盘是1GB(1024MB),1TB(1024 GB)还是其他。

更好的是@juergen_d的答案,您以软编码的形式保存此信息,因为它不仅告诉您数字值的实际含义,而且还使您可以选择在运行时更改此值/到更合适的单位(例如,如果您以GB存储磁盘空间,并且对跟踪具有1MB内存的Raspberry Pi提出了新要求,则它可能会以0GB的形式存储在旧列中(如果是整数值),毫无意义。

不过,我会对unit_table方法进行一些修改。

  • 首先,对于每种类型的单位,我都有一个单位表(例如,用于KB,MB,GB,TB等容量单位的单位表,而对于计算速度单位(MHz,GHz,等等),这样可以避免任何不合理的风险,例如32GHz的硬盘空间。

  • 第二,我要包含一个转换因子。即在表中包括数据,以便您转换为标准基本单位,以便您的逻辑可以将1024MB值与1GB值进行比较,并确定它们表示相同的基础值。如果您决定更改基本单位,则可以选择。

例如

create table CapacityUnit
(
    UnitId nvarchar(12) primary key clustered --e.g. GB
    , Name nvarchar(36) not null -- optional long form; e.g. Gigabyte
    , KbMultiplier bigint not null --i.e. if we store a value of 1GB, what should we multiply by to convert that to KB (or whatever our base unit is)
)
insert CapacityUnit(UnitId, Name, BaseMuliplier)
values ('KB', 'Kilobyte', 1)
, ('MB', 'Megabyte', 1024)
, ('GB', 'Gigabyte', 1024*2014)
, ('TB', 'Terabyte', 1024*2014*2014)
create table ConfigurationSettings
(
    OneRecordOnly bit not null default(1) check(OneRecordOnly=1) primary key
    , ConfigurationSettingsnvarchar(12) not null foreign key references CapacityUnit(UnitId)
)
insert ConfigurationSettings(ConfigurationSettings) values ('KB')

然后,您可以创建一个计算列或查看您的数据,以将该数据转换为KB值;这样就可以在运行时轻松查询该值,也可以轻松比较不同单位的值。

您还可以反过来使用这种方法;在这里,您可以使用相同的单位表来提供转化信息,但是将所有值都存储在它们的通用基本类型中(即每个Zohar's answer,但这样做的好处是在需要时具有执行转化所需的数据)。

哪种方法更有意义取决于您如何使用数据;如果您执行大量需要比较或汇总不同记录的操作,则Zohar会获胜;如果您只是创建一个库存管理系统(例如,您只想记录和查找单个记录的位置),则每条记录具有不同的单位将减少负担,存储显示的值可能会更有利根据商品的规格。采取哪种设计取决于您将如何处理数据以及应用程序逻辑将如何处理它(例如,如果您出于显示目的将所有内容都转换为通用库,则可能会抵消保留原始数据的好处)值)。

您的问题中未提及的其他注意事项...不要忘记,除了处理器的速度之外,您还可以拥有不同数量的处理器(插槽)和不同数量的内核。幸运的是,您没有看到(或者我从未听说过)在同一系统中可能存在具有不同内核数/不同速度的不同插槽的情况;因此,您可能只需将这些信息保存在其他字段中,而不必拥有一个子表来存储与该设备关联的每个逻辑处理器。