要求是:用户应该能够定义他们想要存储的文档的结构。
例如,用户可以决定存储具有以下结构的银行对账单:
- 发布日期(日期)
- 详情(文字)
- 借方(数字)
- 信用(数)
- 值_日期(日期)
- 参考文献(文字)
然后选择一个文件加载到数据库中。
另一个用户或同一用户还可以加载具有不同结构的不同文档。
如果我们知道可用文档的所有不同结构,我们可以在数据库中创建所有表,但系统必须使用户可以加载任何类型的文档,并定义其自己的结构。
如果可能的话,我正在寻找一种将文档中的所有行保存到单个表中的方法。或者,当用户定义要加载的新文档结构时,我应该动态创建一个新表吗?这是最好的方法吗?
没有任何。没有适合您所描述的数据库设计。说它需要能够存储任何东西就意味着没有办法构造它。
选项
您可以做的是根据用户提供的文档定义动态创建表。您将请求文档中每列的名称和类型。然后,您可以生成一条
CREATE TABLE
语句(使用您选择的任何编程语言)来创建该表,作为该过程的一部分。最好有一个内部UserTables
映射表来存储用户的键以及他们创建的表的名称,以便您可以轻松地在应用程序中引用此列表。根据数据库系统,您可以利用架构将用户隔离到他们自己的架构中。这将使组织和安全控制变得更好。或者,您可以尝试使用EAV 反模式。在这样的设计中,单个表通常有 3 列:实体的键(模型/表)、属性的名称(列名称)、值(该属性/列的)。虽然乍一看很诱人,并且满足您将所有内容存储在单个表中的想法,但使用这种反模式有很多缺点。一些缺点包括丢失数据类型、丢失数据完整性强制、没有关系强制、可扩展性差和查询性能差等。EAV 有意义的场景很少,即使在您的情况下,我也会说选项 1 是更好的选择。
将它们存储为 XML 或 JSON。(这是否意味着在 SQL 数据库中使用 XML/JSON/NVARCHAR 列,或者直接使用 NoSQL 解决方案。)
当然,这会让通过文档内容进行查询变得有些麻烦。但如果这只是转储数据然后检索它的方法,那么这将是有效的解决方案。
如果您需要广泛处理文档的内容,这可能不是一个好主意。