0

我有一个我连接的字段列表,例如:field1 + ';' +字段2。这是我关于如何存储这些连接(v1)的解决方案:

FieldID | Position  | Prefix  | ConcatenationID

15      |0          |NULL     | 30

28      |1          |;        | 30

但我觉得这个解决方案不是那么优雅。我考虑用这个表(V2)替换它:

FieldID | Position  | Separator       | ConcatenationID     | IsSeparator

15      |0          |NULL             |30                   | False

NULL    |1          |;                |30                   | True

28      |2          |NULL             |30                   | False

-V1 具有只存储一个对象(字段)的优点,但无法以清晰的方式表示分隔符。

-V2 具有以清晰的方式表示分隔符的优点,但存储多个对象(字段和字符/字符串)。另外:我讨厌 NULL 列。

两个版本的你们怎么看?

提前感谢您的最终回答。

4

1 回答 1

0
Value|Position (CPK) |ConcatenationID (CPK)
15   |0              |30
;    |1              |30
28   |2              |30
;    |3              |30
15   |0              |40
;    |1              |40
4    |2              |40
;    |3              |40

我不知道您的业务情况中字段和分隔符的示意图含义是什么,但我只是得出以下结论。

select value
from table
where concatenationId = 30 
order by position;

但是,如果您需要区分字段和分隔符。

Value|TypeId|Position (CPK)|ConcatenationID (CPK)
15   |0     |0             |30
;    |1     |1             |30
28   |0     |2             |30
;    |1     |3             |30
15   |0     |0             |40
;    |1     |1             |40
4    |0     |2             |40
;    |1     |3             |40

类型表:

TypeId|Type
0     |Field
1     |Separator

SQL:

select value, type
from table
left join type
using (typeId)
where concatenationId = 30 
order by position;
于 2012-10-28T15:06:39.620 回答