2017-09-14 118 views
2

我正在尝试为不同类型的事件创建数据库。每个事件都有任意的,用户创建的不同类型的属性。例如“客人数量”,“特殊歌曲播放”,“小丑到达时间”。并不是每个活动都有一个小丑,但一个用户仍然可以与一个小丑举办不同的活动。我的基本概念是与不同数据类型的多对多关系

propID | name | type 
------ | ---- | ----- 
    1 |#guest| number 
    2 |clown | time 

和另一个表,每个事件都有唯一的eventID。问题是,一个简单的方法,如

eventID | propID | value 
------ | ------ | ----- 
    1 | 1 | 20 
    1 | 2 | 10:00 

由于不同的数据类型并不真正工作。

现在我想到了一些可能的解决方案,但我不知道哪一个最好,或者是否有更好的解决方案?

1.

我将所有值存储为字符串,并在属性表中使用数据类型。我认为这被称为EAV,并不被认为是良好的做法。

2.

有唯一有意义的数据类型的数量有限,这可能会导致一个表是这样的:

eventID | propID | stringVal | timeVal | numberVal 
------ | ------ | --------- | ------- | -------- 
    1 | 1 | null  | null | 20 
    1 | 2 | null  | 10:00 | null 

3.

使用像多个表可能的数据类型:

 propDateEvent     propNumberEvent 
--------------------------   -------------------------- 
eventID | propId | value   eventID | propId | value 
--------|--------|--------   --------|--------|-------- 
    1 | 2 | 10:00    1 | 1 | 20 

不知何故,我认为每个解决方案都有其起伏。 #1感觉像最简单但最不健壮的。 #3似乎是最干净的解决方案,但如果我想添加例如每个事件的属性优先级。

+0

看看[this](https://stackoverflow.com/questions/4481672/is-eav-hybrid-a-bad-database-design-choice)和[this](http:// sqlblog。 COM /博客/ aaron_bertrand /存档/ 2009/11/19 /什么,是那么坏有关,EAV-anyway.aspx)。因为它的灵活性,Imho,第一种情况会更好,如果你没有有限类型的数据类型的话。 – kzharas210

回答

0

您提出的所有选项都是实体/属性/值或EAV的变体。基本概念是,您将实体(在您的事件事件中),它们的属性(#guest,小丑)以及这些属性的值存储为行,而不是列。

Stack Overflow上有很多关于EAV的问题,讨论了好处和缺点。

您的3个选项提供了不同的数据存储方式 - 但是您没有说明您想要检索数据的方式,或者验证您要存储的数据。这是EAV最大的问题。

您将如何执行所有事件必须具有“#客户”作为必填字段(例如)的规则?你如何找到所有至少有20位客人的活动,而且没有小丑噱头?您将如何显示两个日期之间的事件列表,按日期排序以及客人人数?

如果这些要求对你无关紧要,EAV是好的。如果他们这样做,请考虑使用文档来存储此用户定义的数据(JSON或XML)。 MySQL可以本地查询这些文档,您可以更轻松地执行业务逻辑,并且即使是最简单的业务案例,您也不必为此编写极其令人费解的查询。