一个查找表或许多查找表?

Geo*_*pts 3 sql database-design

我需要使用性别,教育,专业,marital_status,height,residency_status等其他属性来保存基本成员的数据.

我有大约15-18个查找表都有(id,name,value),所有属性都有字符串值.

我应该tbl_members为每个上述属性创建成员表并分别15-18个查找表:

tbl_members:

mem_Id
mem_email
mem_password
Gender_Id
education_Id
profession_id
marital_status_Id
height_Id
residency_status_Id
Run Code Online (Sandbox Code Playgroud)

或者我应该只创建一个查找表tbl_Attributestbl_Attribute_Types

tbl_Attributes:

att_Id
att_Value
att_Type_Id
Run Code Online (Sandbox Code Playgroud)

示例数据:

001 - Male - 001
002 - Female - 001
003 - Graduate - 002
004 - Masters - 002
005 - Engineer - 003
006 - Designer - 003
Run Code Online (Sandbox Code Playgroud)

tbl_Attribute_Types:

att_type_Id
att_type_name
Run Code Online (Sandbox Code Playgroud)

示例数据:

001 - Gender
002 - Education
003 - Profession
Run Code Online (Sandbox Code Playgroud)

要填写查找下拉菜单,我可以选择以下内容:

SELECT A.att_id, A.att_value, AT.att_type_name
FROM tbl_Attributes A
INNER JOIN tbl_Attribute_Types AT ON AT.att_type_Id = A.att_type_Id
WHERE att_Type_Id = @att_Type_Id
Run Code Online (Sandbox Code Playgroud)

以及另一个tbl_mem_att_value用于保存成员属性和值的表

tbl_mem_att_value:

mem_id
att_id
Run Code Online (Sandbox Code Playgroud)

member_id 001的示例数据是Male,Masters,Engineer

001 - 001
001 - 004
001 - 005
Run Code Online (Sandbox Code Playgroud)

所以我的问题是我应该去一个查找表还是许多查找表?

谢谢

HLG*_*GEM 6

永远不要使用一个查找表.这将使查找事物变得更加困难,并且它可能需要多次加入每个查询,这意味着它可能会导致锁定和阻塞问题.此外,在一个表中,您无法使用良好的设计来确保描述符的数据类型是正确的.例如,假设您想要查找两个字符的状态缩写.如果你使用一个简单适合所有的表,那么它必须足够宽,以便任何查找的最大可能值,并且你失去了拒绝错误条目的可能性,因为它太长了.这是后期数据完整性问题的保证.
此外,您无法正确使用外键以确保数据输入仅限于正确的值.这也会导致数据完整性问题.

除了几分钟的开发时间(可能是设计数据库中最不重要的问题)之外,使用一个表没有任何好处.有很多负面因素.