我想代表拥有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标记表示所有者和设备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));
第二种选择在概念上似乎更适合我,因为它允许我插入具有一致访问界面的新设备但我担心性能如果我只有1-3个设备型号可能会更好每个都有一个设备表。
你有什么想法?任何批评都是受欢迎的。)
答案 0 :(得分:0)
你的第二种方法是正确的方向。从你的问题的第一行可以清楚地看出:“我想代表拥有led屏幕,一堆传感器和其他一些属性的设备。”你在现实世界中有三个不同的实体。将它们建模为三个不同的实体。
改善的空间。使用自动递增的整数主键作为ID。我也更喜欢在表名后面调用id
,因此DeviceId
是主键。这意味着任何连接都是“显而易见的”,因为连接字段的名称相同或非常相似。
此外,我认为您需要Sensors
和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)