Хорошая ли идея использовать длинный хэш-код в качестве первичного ключа в базе данных?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Хорошая ли идея использовать длинный хэш-код в качестве первичного ключа в базе данных?

Сообщение Anonymous »

У меня есть панель Siemens, которая сохраняет записи тревог в файле csv. В этом файле есть несколько полей, например, int для кодирования даты и времени в миллисекундах, строка для читаемой даты и времени, а также некоторые другие поля, около 20 полей.
в этом файле панель сохраняет новые записи в конце файла, пока максимальное количество записей не достигнет 10 000. Когда сохраняется последняя запись, следующая сохраняется в первой строке файла csv. Итак, это цикл.
Я хотел бы сохранить эти записи в базе данных SQL Server.
Для этого у меня есть процесс, который читает каждые 5 или 10 минут, поэтому, прежде чем пытаться сохранить файлы в базе данных, мне нужно знать, какие записи являются новыми, чтобы попытаться сохранить только новые записи.
Однако файл . csv не имеет какого-либо уникального поля, я мог бы иметь две записи с одинаковой датой и временем в миллисекундах и одинаковой информацией в полях, поэтому в этом случае я бы считал обе записи одинаковыми.
Проблема в том, что в базе данных я не могу задать первичный ключ, состоящий из 20 полей, поэтому мне нужно создать ключ для записи.
Я думал о создании класса с одним свойством для каждого поля и еще одним свойством для идентификатора, который будет установлен как хэш класса.

Код: Выделить всё

internal class Alarma
{
public long Id { get; init; }

public long TimeMs { get; init; }
public int MsgProc { get; init; }
public int StateAfter { get; init; }
public int MsgClass { get; init; }
public int MsgNumber { get; init; }
public string? Var1 { get; init; }
public string? Var2 { get; init; }
public string? Var3 { get; init; }
public string? Var4 { get; init; }
public string? Var5 { get; init; }
public string? Var6 { get; init; }
public string? Var7 { get; init; }
public string? Var8 { get; init; }
public string? TimeString { get; init; }
public string? MsgText { get; init; }
public string? Plc { get; init; }

private Alarma()
{
Id = this.GetHashCode();
}

public Alarma(long parmaTimeMs, int paramMsgProg, int paramStateAfeter, int paramMsgClass, int paramMsgNumber,
string? paramVar1, string? paramVar2, string? paramVar3, string? paramVar4, string? paramVar5, string? paramVar6, string? paramVar7, string? paramVar8,
string? paramTimeString, string? paramMsgText, string? paramPlc)
{
TimeMs = parmaTimeMs;
MsgProc = paramMsgProg;
StateAfter = paramStateAfeter;
MsgClass = paramMsgClass;
MsgNumber = paramMsgNumber;
Var1 = paramVar1;
Var2 = paramVar2;
Var3 = paramVar3;
Var4 = paramVar4;
Var5 = paramVar5;
Var6 = paramVar6;
Var7 = paramVar7;
Var8 = paramVar8;
TimeString = paramTimeString;
MsgText =paramMsgText;
Plc = paramPlc;

Id = this.GetHashCode();
}

public override bool Equals(object obj)
{
if (obj is Alarma other)
{
return TimeMs == other.TimeMs
&& MsgProc == other.MsgProc
&& StateAfter == other.StateAfter
&& MsgClass == other.MsgClass
&& MsgNumber == other.MsgNumber
&& Var1 == other.Var1
&& Var2 == other.Var2
&& Var3 == other.Var3
&& Var4 == other.Var4
&& Var5 == other.Var5
&& Var6 == other.Var6
&& Var7 == other.Var7
&& Var8 == other.Var8
&& TimeString == other.TimeString
&& MsgText == other.MsgText
&& Plc == other.Plc;
}
return false;
}

public long GetHashCode()
{
long hash = 17;
hash = hash * 31 + TimeMs.GetHashCode();
hash = hash * 31 + MsgProc.GetHashCode();
hash = hash * 31 + StateAfter.GetHashCode();
hash = hash * 31 + MsgClass.GetHashCode();
hash = hash * 31 + MsgNumber.GetHashCode();
hash = hash * 31 + (Var1?.GetHashCode() ?? 0);
hash = hash * 31 + (Var2?.GetHashCode() ?? 0);
hash = hash * 31 + (Var3?.GetHashCode() ?? 0);
hash = hash * 31 + (Var4?.GetHashCode() ?? 0);
hash = hash * 31 + (Var5?.GetHashCode() ?? 0);
hash = hash * 31 + (Var6?.GetHashCode() ?? 0);
hash = hash * 31 + (Var7?.GetHashCode() ?? 0);
hash = hash * 31 + (Var8?.GetHashCode() ?? 0);
hash = hash * 31 + (TimeString?.GetHashCode() ?? 0);
hash = hash * 31 + (MsgText?.GetHashCode() ?? 0);
hash = hash * 31 + (Plc?.GetHashCode() ?? 0);

return hash;
}
}
Но я не знаю, стоит ли использовать хеш-код в качестве первичного ключа, потому что могут возникнуть коллизии и потерять некоторые строки.
А будут ли другие варианты?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/788 ... a-database
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Хорошая ли идея использовать длинный хэш-код в качестве первичного ключа в базе данных?
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Ошибка Android Facebook: неверный хэш ключа. хэш ключа не соответствует ни одному сохраненному хешу ключа
    Anonymous » » в форуме Android
    0 Ответы
    113 Просмотры
    Последнее сообщение Anonymous
  • Хорошая ли идея использовать std::initializer_list в полиморфном классе?
    Гость » » в форуме C++
    0 Ответы
    35 Просмотры
    Последнее сообщение Гость
  • Хорошая ли идея использовать Kafka для операций обновления и вставки в Java-проект?
    Anonymous » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Хорошая ли идея использовать `DeferredResult>`
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»