mySQL 中应如何构建分层数据
How should hierarchical data be structured in mySQL
我们正在设计一个数据库来跟踪网络,包括服务器、交换机和摄像头。我们注意到 table 定义中有大量继承。例如,所有交换机都有一个IP地址,但有些有48个端口,有些只有24个,有些有SFP端口,有些有两个电源,有些只有一个。
我知道无论是在普通编程还是 OO 编程中,您都喜欢将所有内容都放在 modules/objects 中。因此,最好为 DOOR 和 HANDLE 对象使用 class,而不是使用变量定义其句柄的 DOOR class。关系型数据库也是这样吗
这里有两种描述收发器的方式。我可以用这样的布尔变量创建一个 table
CREATE TABLE IF NOT EXISTS Transceiver
(
ID INT NOT NULL AUTO_INCREMENT,
singleMode BOOL,
multiMode BOOL,
1Gig BOOL,
10Gig BOOL,
1km BOOL,
10km BOOL,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
或者我可以像这样创建多个 table
CREATE TABLE IF NOT EXISTS MM1G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM10G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM1G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM10G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM1G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM10G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM1G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM10G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
关系数据库的问题是你必须使用联接和联合,如果你有 15 个不同的 table,整个事情就会变成一场噩梦。
如果有人想知道,我们稍后需要生成物料清单,因此我们可能需要找出单模收发器的总数,或 PSU 的总数,或所有 24 端口的功耗开关等
编辑
我只是发现我的示例中没有层次结构,但是,我可以这样进行:
- 收发器Table
- Single/Multi模式收发器table指向收发器Table
- 等等
您可以将相关的布尔列合并到一个域中。例如1Gig和10Gig可以组合成一个Speed整数列,1km和10km组合成一个Range整数列,如果singleMode和multiMode互斥,则只需要记录其中之一。
联接和联合不是关系 DBMS 的问题,它们是它们的一些最佳特性。构建关系并从记录的事实中获取信息的能力使关系 DBMS 成为可以回答问题的有用且智能的代理,而不是仅存储和检索字节的愚蠢记录存储。
当数据库设计良好时,我很少需要连接 15 个表,但当我这样做时,这样做通常既简单又高效。
不要将面向对象编程与关系数据库或数据建模混淆。 OO 非常适合构建使用状态的状态机。 (关系)数据建模非常适合组织状态。这两个学科是正交的。
我认为您的数据不需要层次结构。
我们正在设计一个数据库来跟踪网络,包括服务器、交换机和摄像头。我们注意到 table 定义中有大量继承。例如,所有交换机都有一个IP地址,但有些有48个端口,有些只有24个,有些有SFP端口,有些有两个电源,有些只有一个。
我知道无论是在普通编程还是 OO 编程中,您都喜欢将所有内容都放在 modules/objects 中。因此,最好为 DOOR 和 HANDLE 对象使用 class,而不是使用变量定义其句柄的 DOOR class。关系型数据库也是这样吗
这里有两种描述收发器的方式。我可以用这样的布尔变量创建一个 table
CREATE TABLE IF NOT EXISTS Transceiver
(
ID INT NOT NULL AUTO_INCREMENT,
singleMode BOOL,
multiMode BOOL,
1Gig BOOL,
10Gig BOOL,
1km BOOL,
10km BOOL,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
或者我可以像这样创建多个 table
CREATE TABLE IF NOT EXISTS MM1G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM10G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM1G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS MM10G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM1G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM10G1KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM1G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS SM10G10KmTransceiver
(
ID INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)ENGINE=InnoDB;
关系数据库的问题是你必须使用联接和联合,如果你有 15 个不同的 table,整个事情就会变成一场噩梦。
如果有人想知道,我们稍后需要生成物料清单,因此我们可能需要找出单模收发器的总数,或 PSU 的总数,或所有 24 端口的功耗开关等
编辑 我只是发现我的示例中没有层次结构,但是,我可以这样进行:
- 收发器Table
- Single/Multi模式收发器table指向收发器Table
- 等等
您可以将相关的布尔列合并到一个域中。例如1Gig和10Gig可以组合成一个Speed整数列,1km和10km组合成一个Range整数列,如果singleMode和multiMode互斥,则只需要记录其中之一。
联接和联合不是关系 DBMS 的问题,它们是它们的一些最佳特性。构建关系并从记录的事实中获取信息的能力使关系 DBMS 成为可以回答问题的有用且智能的代理,而不是仅存储和检索字节的愚蠢记录存储。
当数据库设计良好时,我很少需要连接 15 个表,但当我这样做时,这样做通常既简单又高效。
不要将面向对象编程与关系数据库或数据建模混淆。 OO 非常适合构建使用状态的状态机。 (关系)数据建模非常适合组织状态。这两个学科是正交的。
我认为您的数据不需要层次结构。