我想代表一个拥有 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/