【发布时间】:2017-08-01 19:38:51
【问题描述】:
我有一个关于我的数据库建模的问题。
我有一个包含项目/系统的简单数据库(参见下面的示例)
有一个主表,其中包含系统 ID、名称、描述以及每个系统的几个其他字段/属性。
每个系统都可以是某种“系统类型”(例如服务器、路由器、加密器等)。
我已将这些“类型”与代码(下例中的 systemtype_code)放在一个单独的表中。
我想要实现的(它已经在工作但不灵活)是:
- 我想为每种系统类型自定义“值/属性”。
例如,如果系统类型是“SSR”,我希望有“机架”、“机架位置”等字段。 如果系统类型是“RTR”,我希望有诸如“端口数”、“系统日志服务器(包含其他项目的列表框)”等字段。
我想你明白了。
我设法用类似于下面的例子的东西来做到这一点(一些字段可以自然地用于许多系统类型),但它非常简单。 它工作得很好,但它受到限制,因为该字段只能是一种类型(TEXT、VARCHAR 或其他类似的东西)。
所以我的问题是:
- 我的方法是好方法吗? (最后会生成巨大的链接表)
- 我该如何改进它,以便它允许某些自定义字段具有不同的类型(例如,列表框等)
谢谢
这是我目前拥有的一个示例:
--------------------
table : systems
--------------------
sid
name
description
building_code
responsible_user
systemtype_code
--------------------
table : systemtypes
--------------------
systemtype_code
systemtype_name
--------------------
table : systemattrs
--------------------
systemattr_id
systemattr_name
--------------------
table : systemattrvalues
--------------------
sid
systemattr_id
systemattr_name
--------------------
table : l_systemattrs_systemtypes
--------------------
systemattr_id
systemtype_code
要获取与系统相关的属性,我可以简单地进行如下查询:
SELECT a.systemattr_name,
v.systemattr_value
FROM systemattrs a,
systemattrvalues v,
systemtypes t,
l_systemattrs_systemtypes l
WHERE v.sid = 'MY_DESIRED_SYSTEM_ID'
AND l.systemattr_id = a.systemattr_id
AND l.systemtype_code = t.systemtype_code
AND v.systemattr_id = a.systemattr_id
效果很好,但不是我想要的。
如果您想要一个数据库设计架构来更好地理解我的问题,请告诉我。
【问题讨论】:
-
展开:
...but is not exactly what I want? -
研究 EAV 的优缺点。阅读有关数据库实体子类型的信息。
-
@PaulT。正如我所说,限制是我只能为该自定义字段使用 1 种数据类型(例如 VARCHAR),但是如果我想要一个列表框而不是自定义字段呢?
-
EAV 架构很可能会让你伤心。
标签: mysql database oracle database-design relational-database