mysql - mysql 的设计决策

标签 mysql database-design create-table

我想代表一个拥有 LED 屏幕、一堆传感器和一些其他属性的设备。问题是我知道,将来我们可能需要存储不同类型的设备,所以我在犹豫如何在数据库中表示。

我的第一个方法是这样的表格:

CREATE TABLE device_name (
 id STRING(32) NOT NULL UNIQUE,
 led00 STRING(6) DEFAUTL "000000",...,
 sensor_name_status BOOL,
 sensor_name_data REAL,
 ....
 owner STRING(32) NOT NULL,
 PRIMARY KEY (id),
 FOREIGN KEY (owner) REFERENCES users(id));

这样,我使用 md5 token 作为标识符来表示所有者和设备 ID,并且每个 LED 和传感器都有一个字段。

其他方法是:

CREATE TABLE devices (
id STRING(32) NOT NULL UNIQUE,
owner STRING(32) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (owner) REFERENCES users(id));

CREATE TABLE sensors (
device_id STRING(32) NOT NULL,
status BOOL,
data REAL,
type INT(3) NOT NULL,
PRIMARY KEY (device_id,type)
FOREIGN KEY (device_id) REFERENCES devices(id));

CREATE TABLE leds (
device_id STRING(32) NOT NULL,
value STRING(6) NOT NULL,
x INT(3) NOT NULL,
y INT(3) NOT NULL,
PRIMARY KEY (device_id,x,y),
FOREIGN KEY (device_id) REFERENCES (devices));

第二种选择在概念上似乎更适合我,因为它允许我插入具有一致访问接口(interface)的新设备,但我担心如果我只有 1-3 个设备型号,那么拥有一个可能会更好每一个的设备表。

你有什么想法?欢迎任何批评:)

最佳答案

你的第二种方法是正确的方向。从你的问题的第一行就可以清楚地看出:“我想代表一个拥有 LED 屏幕、一堆传感器和一些其他属性的设备。”您在现实世界中拥有三个不同的实体。将它们建模为三个不同的实体。

还有改进的余地。对 ids 使用自动递增整数主键。我还喜欢在表名称之后调用 id,因此 DeviceId 是其主键。这意味着任何联接都是“显而易见的”,因为联接字段的名称相同或非常相似。

此外,我认为您需要用于传感器以及可能的LED的附加表。也就是说,type信息应该存储在不同的表中。

这是我的建议:

CREATE TABLE Devices (
    DeviceID int not nullauto_increment primary key
    Name varchar(32) NOT NULL UNIQUE,
    Owner_UserId int NOT NULL,
    FOREIGN KEY (Owner_UserId) REFERENCES users(Userid)
);

create table Sensors (
    SensorId int not null auto_increment primary key,
    Type int,
    Name varchar(255)
);

CREATE TABLE sensors (
    DeviceID int NOT NULL,
    SensorID int not null,
    status BOOL,
    data REAL,
    primary key (DeviceID, SensorId)
    foreign key (DeviceID) REFERENCES devices(DeviceID),
    foreign key (SensorId) REFERENCES sensors(SensorID),
);

CREATE TABLE leds (
    DeviceID int not null,
    value varchar(6) NOT NULL,
    x INT(3) NOT NULL,
    y INT(3) NOT NULL,
    PRIMARY KEY (DeviceID, x, y),
    FOREIGN KEY (DeviceID) REFERENCES devices(DeviceID)
);

一般情况下,在创建表格时,我也会在末尾添加两到三个默认列:

CreatedAt . . . the date/time when created (a timestamp column in MySQL)
CreatedBy . . . who created the column
CreatedOn . . . The server where the machine was created (if the system is going to span servers)

关于mysql - mysql 的设计决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498677/

相关文章:

处理较小批处理的 PHP Process

mysql - Ruby on Rails/ActiveRecord 和表分区

Mysql - 我如何查询过去(回到过去)?

php - 架构/部署决策

mongodb - MongoDB和Redis有什么区别?

mysql - 无法创建/写入文件 - Linux 中的错误代码 13

c# - 如何通过以下语法访问 C# 字典元素?

sql-server - Facebook 的 DB 模式,如 Wall + "Shared links"

mysql - 一次创建数据库和表?

MySql 查询创建除一张表外的所有表,并出现错误 1146